31

我可以在检查约束中进行SQL子查询吗?检查约束中的SQL子查询

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

post_id -> post.iduser_id -> user.idpost.owner -> user.id

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

这怎么可能?

+0

它为什么重要,如果引用一个表中的列恰巧有一个*值*存在于另一个表?你想解决什么问题? – SingleNegationElimination 2012-04-16 18:33:52

回答

51

不支持在CHECK约束中查看当前行之外的内容。

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

指定为列约束检查约束应引用 该列的唯一值,而表达式表中的约束 出现可以引用多个列。

当前,CHECK表达式不能包含子查询,也不能引用 变量,而不是当前行的列。

这个限制有很好的理由,但是如果你喜欢在繁忙的交通中乘坐独轮车时玩火把,你可以使用函数来颠覆限制。在这种情况下不会回来咬你是难得的;相反,在触发器代码中执行不变量会更安全。

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

+19

+1对于“通过繁忙的交通骑独轮车玩转熊熊燃烧的火把”:-) – 2014-02-18 05:22:54

+4

根据[Tom Lane的评论](http://www.postgresql.org/message-id/[email protected] ),不建议对子查询限制进行攻击:_“CHECK意味着在隔离**中处理对行值**的约束。如果尝试使用它来强制执行交叉行条件,那么项目肯定会严重结束。 _ – Shane 2014-11-11 22:26:05

+2

是的,这是真实的:“CHECK是为了单独处理行值的限制。”但是:什么是唯一约束?它是“在繁忙的交通中骑着独轮车时玩火把手吗?我已经尝试过两种玩火炬手和独轮车的游戏,到目前为止,我不可能在一个游戏中,也可能在将来游戏中玩游戏。 – guettli 2017-02-07 12:20:26