在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。 -感谢您的解决方法!您能否也请解释为什么不允许上面的示例?
答案 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中记录了此行为。
注意:这是因为您的更新可能是周期性的……如果更新该记录会导致某些事情发生,该怎么办? 条件为假?您知道不是这样,但是引擎 没有。桌子上的桌子上也可能有相反的锁。 操作。
答案 1 :(得分:1)
您是否尝试避免子查询?
UPDATE actor
SET last_name = 'foo'
WHERE last_name = 'bar';