我有一个“评论”表,它模拟了一个主题的对话,如下所示:
id serial
topic_id integer
parent_comment_id integer
body text
因此,每条评论都引用了它的主题,最终还有它的父评论(如果它不是关于该主题的第一条评论)。
我想添加一个约束,以防止添加主题/父项不匹配的行(例如,通过引用没有所需评论的主题,或者相反地引用错误主题的评论)。
这可能吗?是否需要触发器?
(为了记录,我试过
ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
REFERENCES comments (id, topic_id)
但它抱怨there is no unique constraint matching given keys for referenced table "comments"
)
您需要在两个(id,topic_id)上添加超级键(唯一索引/约束)。这为您提供了创建外键的“目标”唯一性。在这种情况下,这就像一个 CHECK 约束。
注意: id 仍然是保留模型的主键。即使 id 是串行的,从建模的角度来看,将 PK 更改为 (id,topic_id) 也是错误的
尝试
如果你想让这个工作:
然后我相信您需要将您的 PK 更改为同时出现在 id 和 topic_id 列上。
另外,我认为这个链接有助于解释你需要什么:http ://www.postgresql.org/docs/8.1/static/ddl-constraints.html