it-swarm-fr.com

Touche étrangère multicolenne non unique

J'ai une table "Commentaires" qui modélise une conversation sur un sujet, comme ceci:

id serial  
topic_id integer  
parent_comment_id integer
body text

Donc, chaque commentaire a une référence à son sujet et finalement son commentaire parent (si ce n'est pas le premier commentaire sur le sujet).
[.____] J'aimerais ajouter une contrainte qui empêcherait d'ajouter des lignes ayant une rubrique/parent incompatible (par exemple en référençant un sujet qui ne a le commentaire requis , ou inversement, un commentaire qui fait référence au mauvais sujet).
Est-ce possible? Est un déclencheur requis?

(Pour l'enregistrement, j'ai essayé

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
                 REFERENCES comments (id, topic_id)

mais il se plaint que there is no unique constraint matching given keys for referenced table "comments")

7
Joril

Vous devez ajouter Super-Key (index unique/contrainte) sur les deux (id, topic_id). Cela vous donne l'unicité "cible" pour créer votre clé étrangère. Cela agit comme une contrainte de contrôle dans ce cas.

ALTER TABLE comments ADD 
    FOREIGN KEY (parent_comment_id, topic_id) REFERENCES comments (id, topic_id)

Remarque: L'ID reste comme une clé primaire pour préserver le modèle. Même si ID est en série, il serait faux d'une perspective de modélisation de changer le pk à (id, topic_id)

4
gbn

Essayer

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
    REFERENCES comments (id)

Si vous voulez que cela fonctionne:

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
    REFERENCES comments (id, topic_id)

Ensuite, je crois que vous devez changer votre PK pour être sur les colonnes ID et Topic_id.

En outre, je pense que ce lien aide à expliquer ce dont vous avez besoin: http://www.postgresql.org/docs/8.1/static/ddl-constraint.html

1
SQLRockstar