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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Developlee/article/details/75070855

题:获取手机号(phone)为 13787457845 的用户的邀请码(invateCode),并将邀请码赋值给手机号(phone)为 15478564578的用户。

一般的写法是: update tb_user set invateCode = (select invateCode from tb_user where phone = '13897457845') where phone = '15478564578' 

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

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

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

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

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

正确的写法:

update tb_user set invateCode = (select invateCode from (select * from tb_user) as tb_temp where phone = '13787457845' ) where phone = '13897457845'

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



展开阅读全文

没有更多推荐了,返回首页