prayerslayer
Oar. Mh.
|
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. 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? ![:)](/images/smilies/smile.gif) tia!
Bearbeitet von prayerslayer am 29.01.2008, 14:05
|
tinker
SQUEAK
|
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.
|
graah, in der DDL geht sowas nicht? ![:(](/images/smilies/frown.gif) sonst muss ich halt ein bissl trigger coden gehen
|
Triple-X
Addicted
|
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: ALTER TABLE [dbo].[Situation]
WITH CHECK ADD CONSTRAINT [FK_situation_diensthabende]
FOREIGN KEY([MitarbeiterID], [JournalID])
REFERENCES [dbo].[Diensthabende] ([MitarbeiterID], [JournalID])
|
prayerslayer
Oar. Mh.
|
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
|
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 ![:)](/images/smilies/smile.gif) // damn: owned /// @prayerslayer: man codet nie um sonst
Bearbeitet von tinker am 29.01.2008, 14:07
|
prayerslayer
Oar. Mh.
|
timeownage. sorry, dass du umsonst gecoded hast ![:D](/images/smilies/biggrin.gif) aber danke für die mühe
|
Triple-X
Addicted
|
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.
|
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?
|
Triple-X
Addicted
|
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.
|
naja ich hab jetzt meinen supercoolen zusammengesetzten fk. ist das insert jetzt ganz normal in der art: 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. 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
Hoffnungsloser Optimist
|
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.
|
what the...? ![:confused:](/images/smilies/confused.gif) 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:](/images/smilies/bash.gif) danke jedenfalls ![;)](/images/smilies/wink.gif) wäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf
Bearbeitet von prayerslayer am 04.02.2008, 10:08
|
Triple-X
Addicted
|
danke jedenfalls wäre nur noch die frage zu klären, warum ich zur hölle keine subselects in einem insert machen darf ![:D](/images/smilies/biggrin.gif) Weils so ist ![:)](/images/smilies/smile.gif) 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.
|
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](/images/smilies/biggrin.gif) und danke!
|