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

题:获取手机号(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临时表,存放查询结果集,这样就能避开上面说的错误。



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值