我可以在检查约束中进行SQL子查询吗?我有一个post表,列为id, owner我有另一个表action,列user_id, post_id表user,列idpost_id -> post.id和user_id -> user.id以及post.owner -> user.id现在我想将post(post_id).id != user_id约束到表action上这怎么可能?
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
8ehkhllq1#
不支持在CHECK约束中查看当前行以外的内容。http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html说:指定为列约束的check约束应仅引用该列的值,而出现在表约束中的表达式可以引用多个列。目前,CHECK表达式不能包含子查询,也不能引用当前行的列以外的变量。这种限制有很好的理由,但是如果你喜欢在交通繁忙的时候骑着独轮车摆弄燃烧的 Torch ,你可以使用函数来颠覆这种限制。在这种情况下,这将 * 不会 * 回来咬你是罕见的;在触发器代码中强制使用不变量会安全得多。http://www.postgresql.org/docs/9.1/interactive/triggers.html
ddrv8njm2#
一个更好的方法是使用一个before insert/update触发器来执行检查,如果失败,它应该引发一个异常,这将转出整个插入/更新...如果通过,则执行插入/更新。
2条答案
按热度按时间8ehkhllq1#
不支持在CHECK约束中查看当前行以外的内容。
http://www.postgresql.org/docs/9.1/interactive/sql-createtable.html说:
指定为列约束的check约束应仅引用该列的值,而出现在表约束中的表达式可以引用多个列。
目前,CHECK表达式不能包含子查询,也不能引用当前行的列以外的变量。
这种限制有很好的理由,但是如果你喜欢在交通繁忙的时候骑着独轮车摆弄燃烧的 Torch ,你可以使用函数来颠覆这种限制。在这种情况下,这将 * 不会 * 回来咬你是罕见的;在触发器代码中强制使用不变量会安全得多。
http://www.postgresql.org/docs/9.1/interactive/triggers.html
ddrv8njm2#
一个更好的方法是使用一个before insert/update触发器来执行检查,如果失败,它应该引发一个异常,这将转出整个插入/更新...如果通过,则执行插入/更新。