问题描述
在我开始询问之前,我只是心脏病发作了。我的脚本即将在生产站点中使用。幸运的是,它首先在我们的补丁箱中运行。 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);