更新时间: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实现的剩余故障保护,因为它只支持完全表锁,但我不知道为什么要为其他引擎设置它。