Hier ist eine einfache Tabelle, in der Datensätze auf übergeordnete Datensätze in derselben Tabelle verweisen können:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
parent_id INT NULL,
num INT NOT NULL,
txt TEXT NULL,
FOREIGN KEY (parent_id) REFERENCES foo(id)
);
Mit der zusätzlichen Anforderung, dass einer der anderen Feldwerte ( num
) zwischen übergeordneten und untergeordneten Datensätzen identisch sein muss, dachte ich, dass ein zusammengesetzter Fremdschlüssel den Trick machen sollte. Ich habe die letzte Zeile in geändert
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
und ERROR erhalten: Es gibt keine eindeutige Einschränkung, die den angegebenen Schlüsseln für die referenzierte Tabelle "foo" entspricht .
Ich kann diese Einschränkung leicht hinzufügen, verstehe aber nicht, warum dies erforderlich ist, wenn eine der referenzierten Spalten ( id
) bereits eindeutig ist. So wie ich es sehe, wäre die neue Einschränkung überflüssig.
NULL != NULL
. Wie auch immer .. :)UNIQUE INDEX
wo sich Spalten befindenNULLABLE
. Deshalb habe ich es erwähnt. :) Aber ich stimme zu - für den Fall, dass es keine NULL-Werte gibt (und auch keinen Teilindex), ist dies wahrscheinlich ziemlich einfach.Fremdschlüssel im Allgemeinen (nicht nur zusammengesetzt) MÜSSEN auf einen EINZIGARTIGEN SCHLÜSSEL in einer anderen Tabelle verweisen. Andernfalls würde es keine relationale Datenintegrität geben.
Dies ist eine Beschwerde, weil Sie zwar einen eindeutigen Schlüssel für (id) haben, aber keinen eindeutigen Schlüssel für (id, num). Für die Datenbank ist das Paar (id, num) also nicht GARANTIERT, einzigartig zu sein. Wir Menschen können herausfinden, dass es einzigartig sein wird, aber ich bin sicher, dass es eine Menge zusätzlichen Code geben würde, den sie hinzufügen müssten, um Postgres klug genug zu machen, um zu sehen, dass "oh hey ... id soll einzigartig sein." , also id, num sollte auch eindeutig sein "..
Ich wäre sehr überrascht, wenn sie diesen Code hinzufügen würden, wenn Sie lediglich einen weiteren eindeutigen Index für die beiden Spalten erstellen müssten, um das Problem zu beheben.
Um ganz klar zu sein, der Code, den sie hinzufügen müssten, wäre nicht nur dieser einfache Fall ... er müsste alle Fälle behandeln, auch solche, bei denen sich der Fremdschlüssel in mehr als 4 Spalten befindet usw. Ich bin sicher Die Logik wäre ziemlich komplex.
quelle