3 Stimmen

Primärschlüssel auf 2 Tabellen

Ich habe zwei Tabellen, eine 'Master'-Tabelle und eine 'Child'-Tabelle. Jede Tabelle hat ein Feld namens 'ProductNo', das als PRIMARY KEY und UNIQUE definiert ist. Ist es möglich, das Feld 'ProductNo' in der Tabelle 'Child' und das gleiche Feld in der Tabelle 'Master' zusammen als PRIMARY + UNIQUE zu definieren?

Master:
ID | ProductNo

Child:
ID | MasterID (FK auf Master.ID) | ProductNo

Beziehung >> 1 (Master) : n (Child) 

Beispiel Daten:
Master: 
1 | 1234
2 | 4567

Child:
100 | 1 | 3333
101 | 1 | 4444
102 | 2 | 5555
103 | 1 | 1234 <----- NICHT ERLAUBT! PRODUCT NO EXISTIERT BEREITS IN TABELLE `MASTER`
104 | 2 | 1234 <----- NICHT ERLAUBT! PRODUCT NO EXISTIERT BEREITS IN TABELLE `MASTER`

Es ist notwendig zu überprüfen, ob beim Einfügen/Aktualisieren der Tabelle 'Child' 'ProductNo' bereits in der Tabelle 'Master' vorhanden ist.

Wie kann ich das definieren? Oder muss ich einen Trigger dafür erstellen?

Vielen Dank im Voraus, Matt

4voto

Diego Punkte 33073

Nein, es gibt keine so etwas wie zusammengesetzte PKs zwischen Tabellen.

Nur für die Datenkonsistenz, wenn die IDs gleich sind, sollten Sie einen FK vom Kind zum Master hinzufügen.

Um Ihr Problem zu lösen, wäre ein Trigger mit einem Check wie diesem:

if exists (select 1 from master where prodcutId=new_productId)

wäre eine gute Idee

EDIT:

Eigentlich ist die beste Idee, nur eine Tabelle mit dem Namen Produkt mit einem ID und einem masterID-Feld mit einer Beziehung zu sich selbst zu haben. Auf die Weise, wie Sie es heute haben, bin ich ziemlich sicher, dass Sie viele doppelte Daten haben und auf 2 Ebenen der Hierarchie feststecken.

2voto

David M Punkte 69725

(Ursprüngliche Antwort) Sie können einen Fremdschlüssel von Master zu Child deklarieren, auch wenn dieser Fremdschlüssel auf den Primärschlüssel von Child zeigt. Dies würde eine Beziehung von eins zu null oder eins sein und ist nicht so ungewöhnlich. Eine Zeile kann in Child nicht existieren, ohne dass bereits eine übereinstimmende Zeile in Master eingefügt wurde, aber eine Zeile kann in Master existieren, ohne dass eine übereinstimmende Kind-Zeile vorhanden ist. Daher müssen Ihre Einfügungen in der Reihenfolge Master dann Child erfolgen.

(Bearbeitet angesichts der Änderung der Frage) JEDOCH sieht es in Ihrem Fall so aus, als ob die Spalte, auf die Sie sich beziehen, tatsächlich nicht der Primärschlüssel von irgendeiner Tabelle sein sollte, sondern Sie haben einen separaten Primär-/Fremdschlüssel, und die betreffende Spalte muss eindeutig über die beiden Tabellen hinweg sein, was jetzt klar geworden ist, nachdem Sie einige Beispieldaten in Ihre Frage eingefügt haben. In diesem Fall wäre es am besten, Trigger auf beiden Tabellen zu verwenden, um das Vorhandensein in der anderen Tabelle zu überprüfen und das Einfügen/Aktualisieren zu verhindern, wenn die ProductNo bereits vorhanden ist.

1voto

Gerardo Lima Punkte 5995

Genau wie @DavidM gesagt hat, kann es gemacht werden, aber es scheint, dass Sie mit einigen Modellierungsproblemen konfrontiert sind. Erstens, wenn Sie einen natürlichen Primärschlüssel ProductNo haben, warum definieren Sie dann einen Ersatzschlüssel ID? Das andere, was Sie in Betracht ziehen sollten, ist die Kombination dieser beiden Tabellen in eine einzige (was für die meisten 1-zu-1-Fälle sinnvoll sein kann).

1voto

mshthn Punkte 1125

Sind Sie sicher, dass Sie die beiden Tabellen benötigen? Behalten Sie einfach eine Tabelle bei, die productID plus parentID enthält. Dann kann productID ein Primärschlüssel sein und automatisch inkrementiert werden, während alles, was eine parentID hat (fremder Schlüssel zur selben Tabelle) außer null, ein Unterelement wäre.

0voto

Sie können in der Kindertabelle eine Spalte mit dem Namen "ProductNo" hinzufügen und einen Fremdschlüsselverweis auf die Elterntabelle hinzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X