Ich habe eine "Kommentar" -Tabelle, die eine Konversation zu einem Thema wie folgt modelliert:
id serial
topic_id integer
parent_comment_id integer
body text
Jeder Kommentar hat also einen Verweis auf sein Thema UND schließlich seinen übergeordneten Kommentar (wenn es nicht der erste Kommentar zum Thema ist).
Ich möchte eine Einschränkung hinzufügen, die das Hinzufügen von Zeilen mit nicht übereinstimmendem Thema / übergeordnetem Element verhindert (z. B. durch Verweisen auf ein Thema, das nicht den erforderlichen Kommentar enthält, oder umgekehrt auf einen Kommentar, der auf das falsche Thema verweist).
Ist das möglich? Ist ein Auslöser erforderlich?
(Für die Aufzeichnung habe ich versucht
ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
REFERENCES comments (id, topic_id)
aber es beschwert sich, dass there is no unique constraint matching given keys for referenced table "comments"
)
Antworten:
Sie müssen für beide (ID, Topic_ID) einen Superschlüssel (eindeutiger Index / Einschränkung) hinzufügen. Dies gibt Ihnen die "Ziel" -Eindeutigkeit, um Ihren Fremdschlüssel zu erstellen. Dies wirkt in diesem Fall wie eine CHECK-Einschränkung.
Hinweis: Die ID bleibt der Primärschlüssel, um das Modell beizubehalten. Selbst wenn id seriell ist, wäre es aus Modellierungssicht falsch, die PK in (id, topic_id) zu ändern.
quelle
Versuchen
Wenn Sie möchten, dass dies funktioniert:
Dann glaube ich, dass Sie Ihre PK so ändern müssen, dass sie sich sowohl in der Spalte id als auch in der Spalte topic_id befindet.
Ich denke auch, dass dieser Link hilft zu erklären, was Sie brauchen: http://www.postgresql.org/docs/8.1/static/ddl-constraints.html
quelle
number of referencing and referenced columns for foreign key disagree
: / Ich denke, das Problem mit meinem Befehl ist, dass es mehrere Zeilen mit übereinstimmenden Eltern + Thema geben könnte