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);
在我开始询问之前,我刚刚心脏病发作。我的脚本即将进入生产现场。幸运的是,它是 运行 首先出现在我们的补丁盒中。 呸
所以我有这个备份 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);