"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[SQL Server 2005] Zusammengesetzter FK

prayerslayer 29.01.2008 - 13:42 3536 14
Posts

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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!
Bearbeitet von prayerslayer am 29.01.2008, 14:05

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5201
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
graah, in der DDL geht sowas nicht? :( sonst muss ich halt ein bissl trigger coden gehen :o

Triple-X

Addicted
Avatar
Registered: Feb 2001
Location: Pregarten (OÖ)
Posts: 485
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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 ;)
Bearbeitet von prayerslayer am 29.01.2008, 14:04

tinker

SQUEAK
Avatar
Registered: Nov 2005
Location: NÖ
Posts: 5201
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
Bearbeitet von tinker am 29.01.2008, 14:07

prayerslayer

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
timeownage. sorry, dass du umsonst gecoded hast :D aber danke für die mühe :)

Triple-X

Addicted
Avatar
Registered: Feb 2001
Location: Pregarten (OÖ)
Posts: 485
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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

Addicted
Avatar
Registered: Feb 2001
Location: Pregarten (OÖ)
Posts: 485
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11326
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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
Bearbeitet von prayerslayer am 04.02.2008, 10:08

Triple-X

Addicted
Avatar
Registered: Feb 2001
Location: Pregarten (OÖ)
Posts: 485
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

Oar. Mh.
Avatar
Registered: Sep 2004
Location: vorm Sucher
Posts: 4073
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! :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz