URL: https://www.overclockers.at/coding-stuff/sql_server_2005_zusammengesetzter_fk_191013/page_1 - zur Vollversion wechseln!
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));
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
graah, in der DDL geht sowas nicht? sonst muss ich halt ein bissl trigger coden gehen
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: PHPALTER TABLE [dbo].[Situation] WITH CHECK ADD CONSTRAINT [FK_situation_diensthabende] FOREIGN KEY([MitarbeiterID], [JournalID]) REFERENCES [dbo].[Diensthabende] ([MitarbeiterID], [JournalID])
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
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 jaCode: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;
timeownage. sorry, dass du umsonst gecoded hast aber danke für die mühe
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.
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?
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.
naja ich hab jetzt meinen supercoolen zusammengesetzten fk. ist das insert jetzt ganz normal in der art:
Code: PHPINSERT INTO Situation (JournalID, MitarbeiterID, foo, bar) VALUES ('1', '2', 'some', 'string');
Code: PHPINSERT INTO Situation (JournalID, MitarbeiterID, foo, bar) VALUES ((SELECT JournalID, MitarbeiterID FROM Diensthabende WHERE JournalID='1'), 'some', 'string');
Zitat von prayerslayerkurz und bündig: wie schaut die syntax einer insert-anweisung aus, wenn ich - wie in diesem fall - einen zusammengesetzten foreign key habe?
what the...?
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
danke jedenfalls wäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf
Zitat von prayerslayerdanke jedenfallswäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf
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
und danke!
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025