返回
解决MySQL 1093 错误:“无法在 FROM 子句中指定目标表用于更新”
后端
2022-12-24 21:53:59
理解 MySQL 1093 错误:无法在 FROM 子句中指定目标表用于更新
概述
MySQL 1093 错误:"无法在 FROM 子句中指定目标表用于更新"经常困扰着尝试使用 UPDATE 或 DELETE 语句更新或删除数据的开发者。这个错误的根本原因在于,在 FROM 子句中指定的表不能同时用作目标表和关联表。
常见场景
- 直接更新 FROM 子句中的表: 最直接的例子就是直接在 FROM 子句中指定目标表,导致错误。
UPDATE t1
FROM t1
SET name = 'John Doe'
WHERE id = 1;
- 关联查询中的更新: 另一个常见场景是尝试在关联查询中更新数据。
UPDATE t1
SET name = 'John Doe'
FROM t1
INNER JOIN t2 ON t1.id = t2.id
WHERE t2.name = 'Jane Doe';
解决方法
- 使用子查询: 一种解决办法是使用子查询来检索需要更新或删除的行,然后再执行操作。
UPDATE t1
SET name = 'John Doe'
WHERE id IN (SELECT id FROM t2 WHERE name = 'Jane Doe');
- 使用连接查询: 连接查询是另一个可行的选择,它允许我们先获取需要更新或删除的行,然后再操作。
UPDATE t1
SET name = 'John Doe'
FROM t1
INNER JOIN t2 ON t1.id = t2.id
WHERE t2.name = 'Jane Doe';
- 使用派生表: 派生表为我们提供了一种方式来创建临时表,用于存储需要更新或删除的行。
WITH tmp AS (
SELECT id
FROM t2
WHERE name = 'Jane Doe'
)
UPDATE t1
SET name = 'John Doe'
WHERE id IN (SELECT id FROM tmp);
- 使用 Common Table Expression (CTE): CTE 为我们在查询中定义临时表的语法的语法。CTE 非常适合处理复杂的查询问题,包括更新或删除数据。
WITH tmp AS (
SELECT id
FROM t2
WHERE name = 'Jane Doe'
)
UPDATE t1
SET name = 'John Doe'
WHERE id IN (SELECT id FROM tmp);
总结
MySQL 1093 错误是常见错误,但可以通过多种方法解决。最合适的解决方法取决于具体情况。理解错误的原因以及可用的解决方法对于解决此问题至关重要。
常见问题解答
-
为什么我不能直接在 FROM 子句中更新目标表?
- 直接更新 FROM 子句中的目标表会导致 MySQL 混淆,不知道是要更新表还是关联表。
-
子查询和派生表有什么区别?
- 子查询嵌套在主查询中,而派生表是通过 WITH 子句创建的临时表。
-
何时应该使用 CTE?
- CTE 用于处理复杂的查询问题,例如需要多个临时表的情况。
-
我可以使用其他方法来解决此错误吗?
- 除了本文中列出的方法之外,还可以考虑使用触发器或存储过程。
-
如何防止此错误在未来出现?
- 在编写查询时,注意不要在 FROM 子句中指定目标表。