当表中的user_id列不存在时,为什么此查询会删除所有用户profile?
user_id
profile
初始查询 :
DELETE FROM users WHERE user_id IN ( SELECT user_id FROM profile ) AND user_id != 35 AND user_id != 6;
更具体。
IN语句查询返回 :
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的地方)。为避免此可能的问题,您可以使用两个零件名称。
users
users.user_id IS NULL
WHERE NULL IN (NULL)
DELETE FROM users WHERE user_id IN (SELECT p.user_id FROM profile p)
会给出错误
列p.user_id不存在: