我能否在检查约束中使用SQL子查询?
我有一个带有列id, owner
的post
表
我还有另一个带有列user_id,post_id
的表action
表user
具有列id
post_id -> post.id
和 user_id -> user.id
还有 post.owner -> user.id
现在我想在action
表上强制执行post(post_id).id != user_id
如何做到这一点?
我能否在检查约束中使用SQL子查询?
我有一个带有列id, owner
的post
表
我还有另一个带有列user_id,post_id
的表action
表user
具有列id
post_id -> post.id
和 user_id -> user.id
还有 post.owner -> user.id
现在我想在action
表上强制执行post(post_id).id != user_id
如何做到这一点?
在CHECK约束中,不能查看当前行以外的内容。
http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html指出:
作为列约束指定的CHECK约束应该只引用该列的值,而出现在表约束中的表达式可以引用多个列。
目前,CHECK表达式不能包含子查询,也不能引用除当前行的列之外的变量。
这种限制有很好的理由。但如果你喜欢在繁忙的交通中骑着独轮车玩火把,你可以使用函数来规避这个限制。然而,这种情况不会给你带来好处;相比之下,在触发器代码中执行不变性检查更加安全可靠。
http://www.postgresql.org/docs/9.1/interactive/triggers.html
CHECK
**约束中,不支持查看当前行以外的内容。”显然,其他类型的约束(例如 UNIQUE
、PRIMARY KEY
、FOREIGN KEY
、EXCLUDE
)必须查看超出单个行的内容。 - kgrittnCHECK
约束中跨行引用失败的原因在于该约束只对修改的行进行评估。 因此,尽管它通常会“起初”起作用,但当其他被引用的行以一种使约束无效的方式进行修改时,这将不会被注意到。 - kgrittn