[SQL Server 2005] Zusammengesetzter FK

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sql_server_2005_zusammengesetzter_fk_191013/page_1 - zur Vollversion wechseln!


prayerslayer schrieb am 29.01.2008 um 13:42

moin moin.

ich häng da grad beim erstellen meiner tabellen im microsoft sql server 2005. da ist eine tabelle Diensthabende, die 2 foreign keys zusammen als primary key hat (die IDs aus den tabellen Mitabeiter und Journal). in der steht drinnen, welcher mitarbeiter bei welchem dienst gearbeitet hat.

Code:
Diensthabende (
  MitarbeiterID INTEGER REFERENCES Mitarbeiter(MitarbeiterID),
  JournalID INTEGER REFERENCES Journal(JournalID),
    CONSTRAINT PK_Diensthabende PRIMARY KEY (MitarbeiterID, JournalID));

diese beiden attribute brauch ich genau in der kombination, wie sie in der tabelle Diensthabende stehen, aber in einer anderen tabelle, genannt Situation. zu diesem zweck hätte ich gern einen zusammengesetzten foreign key in der tabelle Situation, der mir garantiert, dass MitarbeiterID und JournalID nur in kombinationen vorkommen können, wie sich auch in der tabelle Diensthabende drinstehen.

geht das? und hat wer code für mich? :)

tia!


tinker schrieb am 29.01.2008 um 13:50

hm, hätte gesagt das geht mit nem trigger...
Also MitarbeiterID und JournalID als normalen Foreign key und wenn jetzt zb die MitarbeiterID eingegeben wird wird im Trigger mit der funktion IN überprüft ob die dazugehörige JournalID die eingegeben wurde bei der Diensthabende table passt.

Ich hoff du verstehst was ich meine, ansonsten muss ich schnell a bisserl coden


prayerslayer schrieb am 29.01.2008 um 13:55

graah, in der DDL geht sowas nicht? :( sonst muss ich halt ein bissl trigger coden gehen :o


Triple-X schrieb am 29.01.2008 um 13:57

Wenn ich richtig verstanden habe willst du in einer Tabelle "Situation" einen Fremdschlüssel auf "Diensthabende" mit beiden Schlüsselspalten aus "Diensthabende".
Wenn ja dann gehts das so:

Code: PHP
ALTER TABLE [dbo].[Situation] 
WITH CHECK ADD  CONSTRAINT [FK_situation_diensthabende]
FOREIGN KEY([MitarbeiterID], [JournalID])
REFERENCES [dbo].[Diensthabende] ([MitarbeiterID], [JournalID])


prayerslayer schrieb am 29.01.2008 um 14:00

so hab ich das schon probiert. wollte er nicht. ich hab auch schon probiert, die beiden spalten als normale FKs einzubauen, will er auch nicht.

er behauptet dann, in der tabelle Diensthabende, gibt's keine spalten, die auf die kriterien meines FKs zutreffen.

ich probier allerdings schnell die variante mit WITH CHECK, das hatte ich nicht dabei.

//juchu, mit WITH CHECK geht's! vielen dank Triple-X ;)


tinker schrieb am 29.01.2008 um 14:04

Code:
CREATE TRIGGER addToSituation
ON situation BEFORE INSERT
AS
BEGIN
	SET @right = (SELECT COUNT(*)
		      FROM Diensthabende
		      WHERE new.JournalID IN 
			(SELECT d.JournalID FROM Diensthabende d WHERE new.MitarbeiterID = d.MitarbeiterID));
	if (@right == 0)
		// error
	else
		// INSERT INTO ...
END;
So in etwa, ob die syntax jetzt 100% korrekt is weiß ich nicht, und auf die new-Werte greift ma sicher auch net so zu, aber vllt hilfts ja :)

// damn: owned
/// @prayerslayer: man codet nie um sonst ;) :D


prayerslayer schrieb am 29.01.2008 um 14:04

timeownage. sorry, dass du umsonst gecoded hast :D aber danke für die mühe :)


Triple-X schrieb am 29.01.2008 um 14:05

Ich hab das direkt aus einem Create Skript vom SQL Server Management Studio.
Hab zwar die Tabellen mit dem Designer erstellt, sollte aber auch mit dem gehen.

EDIT:
seh gerade das es schon funktioniert hat bei dir.


prayerslayer schrieb am 31.01.2008 um 16:00

eine frage hätte ich noch. wie schaut dann das insert in die tabelle situation aus? weil getrennt darf ich die werte afaik eigentlich nicht angeben und subselecten lässt er mich in insert-anweisungen nicht?

:confused:


Triple-X schrieb am 03.02.2008 um 21:24

Ich verstehe deine Frage nicht ganz, kannst du die Problemstellung anhand eines Bespiels verdeutlichen?

Bei einem Insert müssen natürlich beide Teile des Fremdschlüssels angegeben werden.


prayerslayer schrieb am 04.02.2008 um 09:22

naja ich hab jetzt meinen supercoolen zusammengesetzten fk. ist das insert jetzt ganz normal in der art:

Code: PHP
INSERT INTO Situation (JournalID, MitarbeiterID, foo, bar)
VALUES ('1', '2', 'some', 'string');

oder schaut es anders aus? iirc hat der server verweigert, wie ich es so probiert habe. immerhin muss er ja eigentlich checken, ob die kombination aus JournalID und MitarbeiterID überhaupt vorhanden ist.

ich hab es auch mit einem subselect probiert, aber das lässt er mich irgendwie gar nicht machen.

Code: PHP
INSERT INTO Situation (JournalID, MitarbeiterID, foo, bar)
VALUES ((SELECT JournalID, MitarbeiterID FROM Diensthabende WHERE JournalID='1'), 'some', 'string');

oder so in der art halt. kurz und bündig: wie schaut die syntax einer insert-anweisung aus, wenn ich - wie in diesem fall - einen zusammengesetzten foreign key habe?


that schrieb am 04.02.2008 um 09:44

Zitat von prayerslayer
kurz und bündig: wie schaut die syntax einer insert-anweisung aus, wenn ich - wie in diesem fall - einen zusammengesetzten foreign key habe?

Ganz genau so wie immer.


prayerslayer schrieb am 04.02.2008 um 09:48

what the...? :confused:

ok, ich geh es noch einmal probieren. post wird editiert...

//grml in ordnung. keine ahnung, was da war, wahrscheinlich hab ich die werte im values-teil in der falschen reihenfolge hingeschrieben und nicht gemerkt :bash:

danke jedenfalls ;) wäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf :D


Triple-X schrieb am 04.02.2008 um 13:49

Zitat von prayerslayer
danke jedenfalls ;) wäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf :D

Weils so ist :)

Auf jeden Fall ist bei TransactSQL (MS SQL Server) ein Subselect in einem Insert nicht erlaubt, ich hab keine Ahnung ob das bei Oracle oder MySQL funktioniert (glaube aber eher auch nicht).


prayerslayer schrieb am 04.02.2008 um 16:10

heftig. ich bild mir stark ein, dass ich das in orcl und mysql ständig gemacht habe...

...aber ok, wird die anwendung halt ein wenig unperfomanter :D

und danke! :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025