小编典典

PostgreSQL IN语句

sql

当表中的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


阅读 785

收藏
2021-04-28

共1个答案

小编典典

根据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不存在:

2021-04-28