MySQL为什么无法更新表并在子查询中从同一表中选择

时间:2019-05-29 06:58:45

标签: mysql

在MySQL v5.6 documentation page底部的UPDATE命令中,它说:

  

您无法更新表并在子查询中从同一表中选择。

例如,这将失败:

UPDATE actor
SET last_name = 'foo'
WHERE actor_id IN (
    SELECT actor_id 
    FROM actor 
    WHERE last_name = 'bar');

注意:请假设列last_name不属于索引的一部分。

为什么不允许这样做,并且有稳定的解决方法吗?

P.S。 -感谢您的解决方法!您能否也请解释为什么不允许上面的示例?

2 个答案:

答案 0 :(得分:2)

这是一个简单的技巧:

UPDATE actor
SET last_name = 'foo'
WHERE last_name = 'bar'

您在做什么与上面的查询相同。

说明:您不能只是更新所选内容。

如果您想继续使用流程,请使用临时表为子查询提供别名,

UPDATE actor a1
SET a1.last_name = 'foo'
WHERE a1.actor_id IN (
    SELECT a2.actor_id 
    FROM actor a2
    WHERE a2.last_name = 'bar');

OR

UPDATE actor a1 SET a1.last_name='foo' 
WHERE a1.actor_id IN (SELECT a2.actor_id 
                    from (SELECT * FROM actor) a2 
                    WHERE a2.last_name = 'bar');

换句话说,在MySQL中,您无法修改SELECT部分​​中使用的同一表。 here中记录了此行为。

在堆栈溢出link1link2上。

  

注意这是因为您的更新可能是周期性的……如果更新该记录会导致某些事情发生,该怎么办?   条件为假?您知道不是这样,但是引擎   没有。桌子上的桌子上也可能有相反的锁。   操作。

答案 1 :(得分:1)

您是否尝试避免子查询?

UPDATE actor
SET last_name = 'foo'
WHERE last_name = 'bar';