mysql 查询更新操作


题:获取姓名为张三 的用户的age,并将age赋值给姓名赵六的的用户。
原始数据:

一般的写法是:

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

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

 

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

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

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

正确的写法:

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM