Foreign Key mit zweiter Bedingung
-
Hi,
Ich habe eine Look-Up Tabelle mit den Spalten ID, SubID und Value. In einer zweiten Tabelle möchte ich einen ForeignKey auf die erste anlegen, wobei die Spalte ID der Schlüssel sein soll, aber nur die Einträge, bei denen SubID einen bestimmten, festen Wert hat (z.B. 2).
Ist so etwas möglich?
-
Ja sicher - es ist nur eine Frage der Umsetzung. Schaue dir mal in mySQL die verschiedenen JOINS an, die werden dir dabei helfen. Ich empfehle auch, Frameworks zu benutzen, die mit Datenbanken eng zusammenarbeiten. Beispielsweise programmiere ich meine Anwendungen mit cakePHP, das einem ziemliche Arbeit abnimmt.
-
Ich arbeite aber mit einer SQL Datenbank und programmiere in C.
Wie ich später pr Join ein Ergebnis bekommen kann, weiß ich. Ein Foreign Key greift aber nicht erst beim Join, sondern die Konsitenz der Datenbank bleibt gewart. Darum muss die Bedingung jederzeit erfüllt sein, nicht erst beim Join.
-
Ich glaube nicht, dass das mit Standard-SQL-Mitteln möglich ist. Darf es überhaupt nichts datenbankspezifisches sein?
MfG SideWinder
-
Im Moment arbeite ich mit MSSQL. Also wenn es da geht, würds mir schon helfen.
-
Heimelchen schrieb:
Ich arbeite aber mit einer SQL Datenbank und programmiere in C.
Wie ich später pr Join ein Ergebnis bekommen kann, weiß ich. Ein Foreign Key greift aber nicht erst beim Join, sondern die Konsitenz der Datenbank bleibt gewart. Darum muss die Bedingung jederzeit erfüllt sein, nicht erst beim Join.Für so etwas nutzt man Trigger. Mit dem passenden Trigger kann man die Plausibilität vor dem Insert bzw. Update überprüfen.
-
Wo ist da genau der Mehrnutzen gegenüber einem foreign key? Der verhindert (zumindest bei MSSQL) auch, dass die Tabellen inkonsistent werden, also ich kann nix löschen oder einfügen, was zu einer Inkonsistenz führen würde.
-
Heimelchen schrieb:
Wo ist da genau der Mehrnutzen gegenüber einem foreign key? Der verhindert (zumindest bei MSSQL) auch, dass die Tabellen inkonsistent werden, also ich kann nix löschen oder einfügen, was zu einer Inkonsistenz führen würde.
Ein Foreign Key erfordert nur, daß die referenzierte ID in der entsprechenden Tabelle existieren muß, und das ein bestimmtes Verhalten beim Löschen erfüllt sein muß. In Deinem Fall, daß Tabelle2:Ref -> Tabelle1:SpaltenID verweist, und Tabelle2:Ref immer korrekte Werte von Tabelle1:SpaltenID enthält.
Mit einem Trigger kann man nun weitere Prüfungen einbauen. Man benutzt ihn zusätzlich zum Foreign Key. Wenn Eintrag in Tabelle2 geändert/eingefügt wird, dann führe Trigger aus. Trigger prüft, ob Tabelle1:SubID eine bestimmte Bedingung erfüllt. Damit dies mit einem Trigger funktioniert, muß sich die Bedingung für Tabelle1:SubID berechnen lassen. Wenn diese Bedingung nicht erfüllt ist, dann wird das Ändern/Einfügen des Datensatzes in Tabelle2 verhindert.