次のように、トピックに関する会話をモデル化する「コメント」テーブルがあります。
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制約のように機能します。
ALTER TABLE comments ADD
FOREIGN KEY (parent_comment_id, topic_id) REFERENCES comments (id, topic_id)
注:モデルを保持するため、idは主キーとして残ります。 idがシリアルであっても、モデリングの観点からPKを(id、topic_id)に変更するのは間違っています。
試す
ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
REFERENCES comments (id)
これを機能させたい場合:
ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
REFERENCES comments (id, topic_id)
次に、PKをid列とtopic_id列の両方に変更する必要があると思います。
また、このリンクは必要なものを説明するのに役立つと思います: http://www.postgresql.org/docs/8.1/static/ddl-constraints.html