MySQL更新FROM从句中的字段 mysql [Err] 1093

来源:互联网 发布:如何制作淘宝首页模板 编辑:程序博客网 时间:2024/05/18 00:49
UPDATE test1 SET id = id + 50 WHERE id IN (SELECT t1.id FROM test1 t1, test2 t2 WHERE t1.id = t2.id)

上面SQL语句是想更新,在test2中存在test1的数据,更新test1表,但是由于要更新的字段 id 跟需要查找的字段重叠,导致会出现如下错误:

[Err] 1093 - You can't specify target table 'testmyisam' for update in FROM clause

错误原因是:MySQL不能更新出现在 from 从句中的字段;
可是这种语句在oracle,甚至pgSQL都是可以执行的,不能执行的原因我猜是由于MySQL历史没有事务的特性决定的(原因是瞎猜的):由于MySQL最早是没有事务的,所以更新应该是执行一条提交一条的,但是由于要更新的字段出现在了from后面,成为了查询条件,那么更新后的语句就有可能再次被查询出来,导致更新的结果跟预期的不符合,所以直接禁止这种操作。

变通方法:
通过 JOIN 技巧进行更新

UPDATE test t1 JOIN (SELECT t1.id FROM test1 t2, test t1 WHERE t1.id = t2.id) t2 ON t1.id = t2.id SET t1.id = t1.id + 50