首页/数据/SQL 速查/MySQL 报错 1093:更新时查询同表
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

MySQL 报错 1093:更新时查询同表

MySQL 不允许在 UPDATE/DELETE 的子查询里直接读同一张表;用派生表包一层或改 JOIN 绕开,是高频报错。

SQL 速查数据更新于 2026-10-12

报错写法

报错写法
UPDATE users
SET vip = 1
WHERE id IN (SELECT id FROM users WHERE amount > 1000);
-- ERROR 1093 (HY000): You can't specify target table 'users' for update in FROM clause

改写

改写
-- 派生表物化一层
UPDATE users
SET vip = 1
WHERE id IN (SELECT id FROM (SELECT id FROM users WHERE amount > 1000) AS x);

-- 或 JOIN 改写
UPDATE users u
JOIN (SELECT id FROM users WHERE amount > 1000) AS x ON x.id = u.id
SET u.vip = 1;
原因MySQL 限制更新目标表不能在子查询中直接出现(防止同一语句读写冲突)
PostgreSQL无此限制,子查询按语句快照读取,可正常执行
影响ORM 批量更新生成的 SQL 容易触发该错误

易错点

  • 派生表包一层在 MySQL 5.7 之前可能不生效(优化器合并),8.0 下可用;升级前先在目标版本验证
  • 改写时注意两段 SQL 的匹配行可能不同(快照时点差异),必要时放到同一事务内

数据来源与参考

  • MySQL 8.0 Reference Manual · UPDATE
  • PostgreSQL Documentation · UPDATE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌