mysql对同一张表进行查询和赋值更新
2017-07-13 16:02
197 查看
题:获取手机号(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临时表,存放查询结果集,这样就能避开上面说的错误。
一般的写法是: 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临时表,存放查询结果集,这样就能避开上面说的错误。
相关文章推荐
- Mysql update语句赋值嵌套select,更新和查询同一张表,必须取别名;用例:更新指定游戏服务器最后启动记录的结束时间
- ORACLE 触发器对同一张表进行更新再查询时,需加自制事务
- Mysql查询结果作为另一张表的更新内容
- oracle触发器中对同一张表进行更新再查询时,需加自制事务
- mysql不能在更新一个表的同时查询同样的一张表
- mysql同一张表查询并更新
- mysql查询数据,根据条件更新到另一张表
- MySQL 查询后插入或更新导致表损坏解决方法
- 如何进行ibatis动态多条件组合查询以及模糊查询(oracle,mysql)
- MySQL中进行树状所有子节点的查询
- mysql查询更新时的锁表机制分析
- shell mysql 查询 赋值 统计
- mysql中如何对text字段值进行追加更新
- mysql 将查询出来的值进行转化
- mysql update in 嵌套子查询更新
- mysql查询更新时的锁表机制分析
- MySQL中进行树状所有子节点的查询
- 数据表中查询日期字段为空的记录并进行赋值的方法
- mysql 将查询结果插入一张表
- Mysql多表查询,多表插入和多表更新