Nehmen Sie die folgenden zwei Tabellen in Oracle:
%Vor% Warum funktioniert diese Aussage nicht? Oder genauer: Warum sollte es nicht funktionieren? Der Grund, warum ich versuche, diese Art von Beziehung zu erstellen, ist, dass ich in Zukunft B.D
löschen möchte, aber die Beziehung FK_E
beibehalten soll.
Ich erhalte den Fehler:
ORA-02270: kein übereinstimmender eindeutiger oder primärer Schlüssel für diese Spaltenliste
"Warum funktioniert diese Aussage nicht oder genauer gesagt, warum sollte das nicht funktionieren? es funktioniert? "
Sie haben den Primärschlüssel auf A als eine Verbindung von zwei Spalten (A, B) definiert. Jeder Fremdschlüssel, der auf PK_AB verweist, muss mit diesen Spalten übereinstimmen. Dies liegt daran, dass ein Fremdschlüssel eine einzelne Zeile in der referenzierten Tabelle angeben muss, die eine bestimmte Zeile in der untergeordneten Tabelle besitzt. Der zusammengesetzte Primärschlüssel bedeutet, dass Spalte A.A doppelte Werte enthalten kann, und so kann Spalte A.B; nur die Permutationen von (A, B) sind einzigartig. Folglich benötigt der referenzierende Fremdschlüssel zwei Spalten.
%Vor%"Da es mehrere PKs gibt, auf die Tabelle B verweist"
Falsch. B verweist auf einen einzelnen Primärschlüssel, der mehr als eine Spalte enthält,
"Sagen wir, in Zukunft möchte ich B.D löschen, aber behalte die Beziehung fk_e. "
Das macht keinen Sinn. Stellen Sie sich folgendes vor: D ist keine Eigenschaft von B, es ist ein Attribut, das B durch seine Abhängigkeit von Tabelle A erbt.
Eine Möglichkeit, diese Situation zu vermeiden, ist die Verwendung eines Ersatzschlüssels (oder synthetischen Schlüssels). Zusammengesetzte Schlüssel sind häufig Geschäftsschlüssel, daher sind ihre Spalten in einem Geschäftskontext von Bedeutung. Eine Eigenschaft von bedeutungsvollen Spaltenwerten ist, dass sie sich ändern können, und Kaskadieren solcher Änderungen an fremden Schlüsseln kann unordentlich sein.
Die Implementierung eines Ersatzschlüssels würde folgendermaßen aussehen:
%Vor%Natürlich können Sie dies auch mit dem von Ihnen geposteten Schema tun, da Sie bereits eine einzelne Spaltenbeschränkung für A (C) haben. Allerdings halte ich es für eine schlechte Praxis, auf eindeutige Einschränkungen statt auf Primärschlüssel zu verweisen, obwohl dies zulässig ist. Ich denke, dies liegt zum Teil daran, dass eindeutige Beschränkungen oft einen Geschäftsschlüssel erzwingen, also eine Bedeutung haben, daher das Potenzial für Veränderungen, aber hauptsächlich, weil die Bezugnahme auf Primärschlüssel einfach der Industriestandard ist.
%Vor%Ein Fremdschlüssel verweist immer auf eine PK einer anderen Tabelle. Weder A noch B Alleine sind PK's. Du hast mehrere PK's.
Auch die Datenbank kann einen partiellen Null-Mehrfach-Fremdschlüssel nicht validieren, daher denke ich, dass die Prüfbedingung auch der Tabelle hinzugefügt werden muss.
%Vor%