检查约束中的SQL子查询

Dip*_*Sen 42 postgresql plpgsql foreign-key-relationship check-constraints

我可以在Check约束中创建SQL子查询吗?

我有一个post表中的列id, owner
我有另一个表action的列user_id, post_id
user的列id

post_id -> post.id并且user_id -> user.idpost.owner -> user.id

现在我想约束post(post_id).id != user_id桌子action

怎么可能?

kgr*_*ttn 66

不支持超出CHECK约束中的当前行.

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

指定为列约束的检查约束应仅引用该列的值,而出现在表约束中的表达式可引用多个列.

目前,CHECK表达式不能包含子查询,也不能引用当前行的列以外的变量.

这种限制是有充分理由的,但是如果你喜欢在交通繁忙的情况下骑单轮脚踏车时使用燃烧的火炬,你可以使用功能来破坏限制.在这种情况下,这种情况不会让你感到难过; 你可以更安全地在触发代码中强制执行不变量.

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

  • 根据[Tom Lane的评论](http://www.postgresql.org/message-id/13340.1271686859@sss.pgh.pa.us),不建议黑客攻击子查询:_"CHECK是为了处理约束隔离的行**值**.如果你试图用它来强制执行跨行条件,项目肯定会结束._ (5认同)
  • "不支持超出**`CHECK`**约束中的当前行." 显然,其他类型的约束(即`UNIQUE`,`PRIMARY KEY`,`FOREIGN KEY`,`EXCLUDE`)必须超越单行. (3认同)
  • 是的,这是真的:"CHECK旨在孤立地处理对行值的约束." ......但是:什么是一个独特的约束?这是"在交通繁忙的情况下乘坐单轮脚踏车时耍火焰火炬"吗?顺便说一句,我已经尝试了两个玩杂耍火炬和骑单轮脚踏车.到目前为止,我不能同时做到这一点,但可能在将来. (2认同)
  • “约束”约束中的跨行引用将严重终止的原因是,仅针对修改后的行评估约束。因此,尽管通常在第一时间就可以工作,但是当其他引用的行以使约束无效的方式进行修改时,这不会引起注意。 (2认同)