MySql表自修改报错:You can‘t specify target table ‘student‘ for update in FROM clause

news/2024/11/8 22:45:38/

文章目录

  • 一、发现问题
  • 二、场景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;


http://www.ppmy.cn/news/1195542.html

相关文章

AM@点与点集的关系@n维空间邻域

文章目录 abstract坐标平面平面点集 平面邻域利用邻域描述点与点集的关系聚点点集分类 n n n维空间基础概念线性运算和空间概念 空间中的两点距离 n n n维空间中的变元极限 n n n维空间内的邻域 abstract 坐标平面和平面点集, n n n维空间点集点与点集的关系n维空间及其邻域 …

各位社区工作者!打工而已,不要太上头!!

社工家人们,打工而已,不要太上头!咱能偷懒的就偷懒啊! 合情合理的偷懒不仅让你更轻松,工作效率还会提高,何乐而不为呢!!就比如说各种报告啊,活动方案这些啊,…

【equals比较方法 和 内部类】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言对象比较equals方法内部类实例内部类静态内部类总结 前言 对象比较equals方法 三种比较相等方法: 第一种,如果两侧是基本数据类型&…

[NOIP2017 提高组] 列队 题解

数据结构。 n 1 n1 n1 的 case:考虑有 m q mq mq 个位置,出队的人直接添加到队尾。维护位置对应的人,每次查询第 k k k 个人的位置。 实现考虑维护 01 序列,表示位置上是 / 否有人,每次查前缀和为 k k k 的位置即…

基于51单片机电子秤-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器,液晶1602显示,HX711模块,按键设置单价,计算总价,超量程报警,蜂鸣器报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 I…

怎样做好金融投资翻译

我们知道, 金融投资翻译所需的译文往往是会议文献、年终报表、信贷审批等重要企业金融资料,其准确性事关整个企业在今后一段时期内的发展战略与经营成效。尤其像年报,对于上市公司来说更是至关重要的。那么,怎样做好金融投资翻译&…

精品基于Python的气象预报系统-爬虫

《[含文档PPT源码等]精品基于Python的气象预报系统-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术&#xff…

学习编程语言需要具备哪些数学基础?

学习编程语言需要具备的数学基础是一个非常广泛和深入的话题。 在计算机科学和软件工程领域,数学与编程语言密不可分,其中包括离散数学、统计学、算法分析等领域。 这里将从以下四个方面详细论述学习编程语言需要具备的数学基础:基本数学知…