查询

mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。update时,会锁表,此时不能再select。所以会报错,此时如

mysql 查询更新操作

mysql在from子句中遇到子查询时,先执行子查询并将结果放到一个临时表中,我们通常称它为“派生表”;临时表是没有索引、无法加锁的。update时,会锁表,此时不能再select。所以会报错,此时如

题:获取姓名为张三 的用户的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 = '赵六'

本文属原创,转载请注明原文:http://www.zhimatong.com/jiaocheng/663.html

为保证教程的实用性及扩大知识面覆盖,如果您有相似问题而未解决,可联系在线客服免费技术支持。

内容有用

联系
顾问

在线
客服
购物车
账号登录

没有账号?立即注册

忘记密码

登录即同意用户协议没有账号? 立即注册
账号注册
我已阅读并同意用户协议
立即注册
注册即同意用户协议已有账号? 立即登录
找回密码

操作步骤:邮箱验证->设置新密码

注册即同意用户协议已有账号? 立即登录