PostgreSQL IN语句
当表中的user_id
列不存在时,为什么此查询会删除所有用户profile
?
:
DELETE FROM users WHERE user_id IN (
SELECT user_id FROM profile
)
AND user_id != 35
AND user_id != 6;
更具体。
:
SELECT user_id FROM profile;ERROR: column "user_id" does not exist
LINE 1: SELECT user_id FROM profile;
运行 返回
DELETE 100
为什么会这样呢?
它是否应该在发生错误时停止执行或返回false或null?
运行PostgreSQL Server 9.0
回答:
根据ANSI标准,此行为是正确的。
如果未限定的列名称未在内部作用域中解析,则将考虑外部作用域。因此,您有效地执行了无意关联的子查询。
只要表格profile
至少包含一行
FROM users WHERE user_id IN (
SELECT user_id FROM profile
)
最终将匹配其中的所有行users
(除非任何不users.user_id IS NULL
等于WHERE NULL IN
(NULL)true的地方)。为避免此可能的问题,您可以使用两个零件名称。
DELETE FROM usersWHERE user_id IN (SELECT p.user_id
FROM profile p)
会给出错误
列p.user_id不存在:
以上是 PostgreSQL IN语句 的全部内容, 来源链接: utcz.com/qa/427036.html