DELETE 查询执行偶数子查询 RETURNED an ERROR

DELETE query executes even sub-query RETURNED an ERROR

在我开始询问之前,我刚刚心脏病发作。我的脚本即将进入生产现场。幸运的是,它是 运行 首先出现在我们的补丁盒中。

所以我有这个备份 table,我用它作为要删除的记录的来源。

CREATE TABLE some_backup_table AS
SELECT name, -- text
       other_column -- text
  FROM original_table
 WHERE 1=1 AND some_condition_which_are_true;

然后我有这个删除查询,从创建的 table 中获取 ID。哪一列不存在。

DELETE FROM original_table 
WHERE original_table_id IN (SELECT original_table_id 
                            FROM some_backup_table);

这就是问题。

来自 original_table 的所有数据都被删除,即使子查询返回有关列不存在的错误。使用 transaction.

也无法停止

有人可以向我解释为什么会这样吗?以及如何看待这一点?我知道我应该注意备份的列 table。但通常情况下,我会备份 table.

的所有列

我们正在使用 psql 9.4。

谢谢!

如果 sub-query 中的列不存在于 sub-query 的 table 中,但存在于外部查询(在您的情况下为 DELETE 语句)中SQL 名称解析指定使用外列。因此,即使 sub-query 作为独立查询无效,它作为 sub-query.

也是有效的

您可以通过始终在列名称前加上 table(别名)作为前缀来避免这种情况。然后以下将抛出错误而不是删除所有行:

DELETE FROM original_table 
WHERE original_table_id IN (SELECT bt.original_table_id 
                            FROM some_backup_table bt);