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 users

WHERE user_id IN (SELECT p.user_id

FROM profile p)

会给出错误

列p.user_id不存在:

以上是 PostgreSQL IN语句 的全部内容, 来源链接: utcz.com/qa/427036.html

回到顶部