您的位置:首页 > 博客中心 > 数据库 >

mysql 一个较特殊的问题:You can't specify target table 'sys_user' for update in FROM clause

时间:2022-03-14 17:21

SELECT uin,account,password,create_user_uin_tree FROM sys_user

结果:

技术分享

表中的create_user_uin_tree标识该条记录由谁创建。

创建新用户时,根据当前登录用户的uin及新创建的用户uin,有如下SQL:

select concat(ifNULL(create_user_uin_tree,concat(‘_‘,2,‘_‘)),‘|_‘,‘97‘,"_")  from sys_user where uin=2

结果:

技术分享

 

那么修改的create_user_uin_tree的标识SQL为:

update sys_user set create_user_uin_tree=(select concat(ifNULL(temp.create_user_uin_tree,concat(‘_‘,2,‘_‘)),‘|_‘,‘97‘,"_")  from sys_user temp where temp.uin=2) where uin = 97;

报错信息:

Error Code: 1093. You can‘t specify target table ‘sys_user‘ for update in FROM clause 0.000 sec

网络上的解答原因:

mysql中不能这么用。 (等待mysql升级吧)。那串英文错误提示就是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。 

调整了下SQL:

update sys_user set 
create_user_uin_tree=(select temp.tree from (select concat(ifNULL(create_user_uin_tree,concat(‘_‘,97,‘_‘)),‘|_‘,‘98‘,"_") as tree  from sys_user where uin=97) temp) where uin = 98;

我将作为子集,

select concat(ifNULL(create_user_uin_tree,concat(‘_‘,97,‘_‘)),‘|_‘,‘98‘,"_") as tree  from sys_user where uin=97) temp

然后再

select temp.tree from(子集)

 子集,这样就不会 select 和 update 都是同一个表。致此问题得到完美解决。

本类排行

今日推荐

热门手游