mysql对同一张表进行查询和赋值更新

题:获取姓名为张三 的用户的age,并将age赋值给姓名赵六的的用户。
原始数据:
在这里插入图片描述
一般的写法是:

UPDATE user 
SET age = ( SELECT age FROM user WHERE name = '张三' ) 
WHERE
	name = '赵六';

这样的写法对Oracle和SQLServer 来说都是正确的。但是mysql会报一个错误 :

[Err] 1093 - You can't specify target table 'tb_user' for update in FROM clause

原因是:mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。

update时,会锁表,此时不能再select。所以会报错,

此时如果将结果集放入临时表,临时表不会上锁,所以,可以正常查询并更新。

正确的写法:

方法一:

UPDATE user 
SET age = ( SELECT age  FROM ( SELECT * FROM user ) AS tb_temp WHERE name = '张三' ) 
WHERE
	name = '赵六'

在这里插入图片描述
查看数据证明赵六的年龄已经修改成12岁。
在这里插入图片描述

注: tb_temp临时表,存放查询结果集,这样就能避开上面说的错误。

方法二:

  1. 创建一个中间表:
create table   tmp as select name  newname,age newage from `user`;

在这里插入图片描述

2.进行修改操作:

UPDATE user 
SET age = ( SELECT age FROM tmp WHERE name = '张三' ) 
WHERE
	name = '赵六';

在这里插入图片描述
原始表的数据赵六已经修改为12岁
在这里插入图片描述
3.删除中间表:

drop table tmp;

方法三:使用mysql建表关键字:TEMPORARY

首先,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:

              CREATE TEMPORARY TABLE 表名 (. )
  1. 创建临时表:
create TEMPORARY table  tmp as select name newname , age newage  from user;
  1. 临时表只在当前连接有效,所以要查看表是否创建成功可以使用以下命令:
select *  from tmp;

在这里插入图片描述

  1. 进行更新操作
UPDATE user 
SET age = ( SELECT age FROM tmp WHERE name = '张三' ) 
WHERE
	name = '赵六';

原始表的数据赵六已经修改为12岁
在这里插入图片描述
4. 更新操作完成以后,关闭数据库连接,再重新打开数据库连接,验证临时表是不是已经被删除掉了。

select *  from tmp;

在这里插入图片描述


以下内容为解决本人的小问题而做的验证和上述问题无关,只是本人的笔记

问题:解决在一张表将同一条数据的某个字段数据更新到本条数据的另一个字段中

方法一:

  1. 创建一个中间表:
create table   tmp as select name  newname,age newage from `user`;

在这里插入图片描述
2.进行修改操作:

UPDATE user s,tmp t SET s.age=t.newname WHERE s.name=t.newname;

在这里插入图片描述
3.删除中间表:

drop table tmp;

方法二:使用mysql建表关键字:TEMPORARY

首先,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。
创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:

              CREATE TEMPORARY TABLE 表名 (. )
  1. 创建临时表:
create TEMPORARY table  tmp as select name newname , age newage  from user;
  1. 临时表只在当前连接有效,所以要查看表是否创建成功可以使用以下命令:
select *  from tmp;

在这里插入图片描述

  1. 进行更新操作
UPDATE user s,tmp t SET s.age=t.newname WHERE s.name=t.newname;
  1. 更新操作完成以后,关闭数据库连接,再重新打开数据库连接,验证临时表是不是已经被删除掉了。
select *  from tmp;

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值