这样的写法对Oracle和SQLServer 来说都是正确的。但是mysql会报一个错误 :
原因是:mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。
update时,会锁表,此时不能再select。所以会报错,
此时如果将结果集放入临时表,临时表不会上锁,所以,可以正常查询并更新。
正确的写法:
UPDATE user
SET age = ( SELECT age FROM ( SELECT * FROM user ) AS tb_temp WHERE name = '张三' )
WHERE
name = '赵六'
查看数据证明赵六的年龄已经修改成12岁。
注: tb_temp临时表,存放查询结果集,这样就能避开上面说的错误。
创建一个中间表:
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 表名 (…. )
创建临时表:
create TEMPORARY table tmp as select name newname , age newage from user;
临时表只在当前连接有效,所以要查看表是否创建成功可以使用以下命令:
select * from tmp;
进行更新操作
UPDATE user
SET age = ( SELECT age FROM tmp WHERE name = '张三' )
WHERE
name = '赵六';
原始表的数据赵六已经修改为12岁
4. 更新操作完成以后,关闭数据库连接,再重新打开数据库连接,验证临时表是不是已经被删除掉了。
select * from tmp;
以下内容为解决本人的小问题而做的验证和上述问题无关,只是本人的笔记
解决在一张表将同一条数据的某个字段数据更新到本条数据的另一个字段中
创建一个中间表:
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 表名 (…. )
创建临时表:
create TEMPORARY table tmp as select name newname , age newage from user;
临时表只在当前连接有效,所以要查看表是否创建成功可以使用以下命令:
select * from tmp;
进行更新操作
UPDATE user s,tmp t SET s.age=t.newname WHERE s.name=t.newname;
更新操作完成以后,关闭数据库连接,再重新打开数据库连接,验证临时表是不是已经被删除掉了。
select * from tmp;