DELETE查询甚至执行子查询RETURNED ERROR

问题描述

在我开始询问之前,我只是心脏病发作了。我的脚本即将在生产站点中使用。幸运的是,它首先在我们的补丁箱中运行。 phe

所以我有了这个备份表,在其中我将其用作删除记录的源。

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

然后我有这个DELETE QUERY,从创建的表中获取ID。 WHICH列不存在。

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

这是问题。

即使子查询返回关于列的错误,也不存在来自original_table的所有数据。使用transaction都无法停止。

有人可以向我解释为什么会这样吗?以及如何看到这种情况呢?我知道我应该注意备份表的列。但是通常,我会备份表的所有列。

我们正在使用psql 9.4。

谢谢!

解决方法

如果子查询的表中不存在子查询中的列,但外部查询(在您的情况下为DELETE语句)中存在子查询,则SQL名称解析将指定使用外部列。因此,即使子查询作为独立查询无效,也作为子查询有效。

您可以通过始终在其表名(别名)前添加列名来避免这种情况。然后,以下将引发错误,而不是删除所有行:

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