📜  您无法在 from 子句 delete 中指定要更新的目标表 (1)

📅  最后修改于: 2023-12-03 15:25:41.140000             🧑  作者: Mango

无法在 FROM 子句 DELETE 中指定要更新的目标表

当在SQL DELETE语句的FROM子句中指定目标表时,会收到类似于“无法在FROM子句DELETE中指定要更新的目标表”这样的错误信息。本文将介绍产生该错误的原因以及如何解决它。

出错原因

该错误通常由以下原因引起:

  • 在单个语句中尝试在同一个表中联接和删除。
  • 在子查询或公共表表达式中尝试删除来自目标表的数据。
  • 将删除操作嵌套在另一个查询中。
解决方法

为了解决这个错误,您可以采取以下措施:

  • 将联接和删除操作分为不同的语句。
  • 在执行删除操作之前创建临时表存储需要保留的数据。
  • 尝试使用其他SQL语句类型,如UPDATE,以避免此错误。

示例代码:

-- 不推荐的方式,会出现错误
DELETE FROM users
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE orders.order_date < '2021-01-01';

-- 推荐的方式,将联接和删除操作分开
CREATE TABLE temp_table AS
SELECT users.*
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE orders.order_date >= '2021-01-01';

DELETE FROM users
WHERE id IN (SELECT id FROM temp_table);

-- 使用UPDATE语句代替DELETE语句
UPDATE users
SET deleted = 1
WHERE id IN (
  SELECT id
  FROM users
  INNER JOIN orders ON users.id = orders.user_id
  WHERE orders.order_date < '2021-01-01'
);

在本文中,我们介绍了“无法在FROM子句DELETE中指定要更新的目标表”错误的原因,并提供了解决这个问题的方法。了解相关错误和解决方案对于SQL开发人员非常重要,这将有助于他们编写高效的SQL查询和减少错误产生的可能性。