已解决
MySql表自修改报错:You can‘t specify target table ‘student‘ for update in FROM clause
来自网友在路上 149849提问 提问时间:2023-11-01 15:41:40阅读次数: 49
最佳答案 问答题库498位专家为你答疑解惑
文章目录
- 一、发现问题
- 二、场景1:在where条件中查询了修改表的数据
- 三、场景2:在set语句中查询了修改表的数据
一、发现问题
在一次准备处理历史数据sql时,出现这么一个问题:You can't specify target table '表名' for update in FROM clause
,大致的意思就是:不能在同一张表中先select再update。
在此进行一下复盘沉淀,使用测试sql复现当时的场景(mysql是8版本),准备测试数据:
CREATE TABLE `student` (`id` int NOT NULL,`name` varchar(255) DEFAULT NULL,`address` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT INTO `athena_opencourse`.`student`(`id`, `name`, `address`) VALUES (1, '张三', '北京');
INSERT INTO `athena_opencourse`.`student`(`id`, `name`, `address`) VALUES (2, '李四', '上海');
二、场景1:在where条件中查询了修改表的数据
update student set address = '杭州'
where id in (select id from student where name = '张三');delete from student
where id in (select id from student where name = '张三');
此时会提示:1093 - You can’t specify target table ‘student’ for update in FROM clause
解决方式:在where子句中再加一层,使其成为临时表:
update student set address = '杭州'
where id in (select tmp.id from (select id from student where name = '张三') tmp);
三、场景2:在set语句中查询了修改表的数据
update student set address = (select address from student where name = '李四')
where name = '张三';
此时,一样的报错:> 1093 - You can’t specify target table ‘student’ for update in FROM clause
解决方式同上,查询时再加一层,使其成为临时表:
update student set address = (select tmp.address from (select address from student where name = '李四') tmp)
where name = '张三';
或者使用update join的方案:
update student s1 ,student s2
set s1.address = s2.address
where s1.name = '张三' and s2.name = '李四';
惊呆了有木有!使用update join语法,可以很轻松的实现跨表的数据修改。
当然,上面的例子中,两个表之间的数据并没有关联关系,如果有关联关系的话,比如说同一个id更新相同的数据,可以使用left join on的语法:
update student s1
left join student s2 on s1.id = s2.id
set s1.address = s2.name;
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"MySql表自修改报错:You can‘t specify target table ‘student‘ for update in FROM clause":http://eshow365.cn/6-29416-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: Linux进程控制——进程创建与退出
- 下一篇: 利用python绘制多个箱型图