且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

&qot;背后的MySQL原理&不能在FROM子句&qot;中指定用于更新的目标表

更新时间:2023-01-31 16:01:41

解决方法是suggested in the documentation,其中解释说它的工作原理是将数据materialized放到临时表中,作为优化器的"诀窍"以获得更好的性能。由于它已记录在案,因此我认为使用它没有任何注意事项。

文档中的解决方法的"最小"示例是:

UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS dt ...);
我也无法解释为什么来自子查询的简单更新在MySQL中不起作用,但是这种物化变通方法让我认为它与解决锁定冲突有关:您不能获得行更新的独占锁,因为它已经有一个SELECT共享锁。当SELECT来自第二个"物化"临时表时,没有冲突。 也就是说,我承认这没有多大意义,因为InnoDB文档详细说明了它支持元组多版本控制和所有四个锁隔离级别,因此应该支持PostgreSQL、Oracle和其他产品中的这种操作。

它发出的错误消息可能是MyISAM实现的剩余故障保护,因为它只支持完全表锁,但我不知道为什么要为其他引擎设置它。