web-dev-qa-db-ja.com

一意でない複数列の外部キー

次のように、トピックに関する会話をモデル化する「コメント」テーブルがあります。

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"

7
Joril

両方(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)に変更するのは間違っています。

4
gbn

試す

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

1
SQLRockstar