在前些天用mysql想在查出子表中对应的数据做更新,居然报错了🤪
概述
You can’t specify target table for update in FROM clause
您无法在FROM子句中指定用于更新的目标表
UPDATE TBL_EMP
SET GENDER = 'M'
WHERE
EMP_ID IN ( SELECT EMP_ID FROM TBL_EMP WHERE EMP_ID < 500 )
-- You can't specify target table 'TBL_EMP' for update in FROM clause
大概的意思就是:在对目标表进行更新操作的时候,不允许我们使用目标表做为子句中查询的表使用,也就是自身更新自身"
解决方法
我们可以把子句查询出来的结果当做一个表,再去把这个表SELECT一遍(也就是掩耳盗铃,实质上我们查询出来的结果还是自身的)
例:
UPDATE TBL_EMP
SET GENDER = 'M'
WHERE
EMP_ID IN (SELECT EMP_ID FROM ( SELECT EMP_ID FROM TBL_EMP WHERE EMP_ID < 500 ) A )
-- 需要注意用SELECT 查子表的时候必须为目标表带上一个别名,如果不带的话会报这个Every derived table must have its own alias(每个派生表都必须有自己的别名)