检查约束中的SQL子查询
我可以在检查约束中进行SQL子查询吗?检查约束中的SQL子查询
我有一个post
表列id, owner
我有另一个表action
的列user_id, post_id
表user
与id
post_id -> post.id
和user_id -> user.id
也post.owner -> user.id
现在我想约束post(post_id).id != user_id
列在桌上action
这怎么可能?
不支持在CHECK约束中查看当前行之外的内容。
http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html说:
指定为列约束检查约束应引用 该列的唯一值,而表达式表中的约束 出现可以引用多个列。
当前,CHECK表达式不能包含子查询,也不能引用 变量,而不是当前行的列。
这个限制有很好的理由,但是如果你喜欢在繁忙的交通中乘坐独轮车时玩火把,你可以使用函数来颠覆限制。在这种情况下不会回来咬你是难得的;相反,在触发器代码中执行不变量会更安全。
http://www.postgresql.org/docs/9.1/interactive/triggers.html
+1对于“通过繁忙的交通骑独轮车玩转熊熊燃烧的火把”:-) – 2014-02-18 05:22:54
根据[Tom Lane的评论](http://www.postgresql.org/message-id/[email protected] ),不建议对子查询限制进行攻击:_“CHECK意味着在隔离**中处理对行值**的约束。如果尝试使用它来强制执行交叉行条件,那么项目肯定会严重结束。 _ – Shane 2014-11-11 22:26:05
是的,这是真实的:“CHECK是为了单独处理行值的限制。”但是:什么是唯一约束?它是“在繁忙的交通中骑着独轮车时玩火把手吗?我已经尝试过两种玩火炬手和独轮车的游戏,到目前为止,我不可能在一个游戏中,也可能在将来游戏中玩游戏。 – guettli 2017-02-07 12:20:26
它为什么重要,如果引用一个表中的列恰巧有一个*值*存在于另一个表?你想解决什么问题? – SingleNegationElimination 2012-04-16 18:33:52