web-dev-qa-db-ja.com

チェック制約のSQLサブクエリ

チェック制約でSQLサブクエリを作成できますか?

列のあるpostテーブルを持っています_id, owner_
別のテーブルactionに列__user_id, post_id_があります
userid

_post_id -> post.id_および_user_id -> user.id_も_post.owner -> user.id_

次に、actionに対してpost(post_id).id != user_idを制約します

そんなことがあるものか ?

43
Dipro Sen

CHECK制約で現在の行を超えて調べることはサポートされていません。

http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html 言う:

列制約として指定されたチェック制約はその列の値のみを参照する必要がありますが、テーブル制約に現れる式は複数の列を参照できます。

現在、CHECK式にはサブクエリを含めることも、現在の行の列以外の変数を参照することもできません。

この制限には正当な理由がありますが、交通量の多い一輪車に乗っているときに炎のようなトーチを操作したい場合は、関数を使用して制限を覆すことができます。これがしない状態に戻ってあなたを噛まない状況はまれです。代わりに、トリガーコードの不変条件を適用する方がはるかに安全です。

http://www.postgresql.org/docs/9.1/interactive/triggers.html

68
kgrittn