40人参与 • 2025-07-15 • ar
mysql 报错 1093 - you can't specify target table
通常出现在尝试在 update
或 delete
语句的 from
子句中直接引用要更新或删除的目标表。
这是因为 mysql 不允许在同一条 sql 语句中直接对一个表进行更新或删除操作,同时又通过子查询引用该表。
直接引用目标表:
update
或 delete
语句的 where
子句中使用子查询,并且这个子查询直接引用了要更新或删除的表时,就会触发这个错误。子查询的嵌套:
将子查询的结果集放入一个临时表中,然后在 update
或 delete
语句中引用这个临时表。(适用数据量小的情况)
-- 创建临时表 create temporary table temp_table as select id from your_table where some_condition; -- 使用临时表进行更新 update your_table set column = new_value where id in (select id from temp_table); -- 删除临时表 drop temporary table temp_table;
使用 join
语句来替代子查询,这样可以避免直接引用目标表。
update your_table t1 join ( select id from your_table where some_condition ) t2 on t1.id = t2.id set t1.column = new_value;
使用 exists
子句来替代 in
子句,这样可以避免直接引用目标表。
update your_table set column = new_value where exists ( select 1 from your_table t2 where t2.id = your_table.id and some_condition );
假设有一个表 employees
,我们想要更新 salary
字段,条件是 department_id
在某个子查询结果集中。
update employees set salary = 5000 where department_id in ( select department_id from employees where department_name = 'sales' );
create temporary table temp_departments as select department_id from employees where department_name = 'sales'; update employees set salary = 5000 where department_id in (select department_id from temp_departments); drop temporary table temp_departments;
update employees e1 join ( select department_id from employees where department_name = 'sales' ) e2 on e1.department_id = e2.department_id set e1.salary = 5000;
update employees set salary = 5000 where department_id in (select a.department_id from( select department_id from employees where department_name = 'sales' )a);
如果在增删改语句中,要使用子查询的形式进行增删改,那么应该把这个子查询进行第二次select
一下并且给上表别名,才可以执行。
这个第二次select
实际上就是把第一次的select
的结果集放在临时表中。
通过这些方法,可以有效地解决 1093 - you can't specify target table
报错问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论