MySQL触发器抛出ERROR 1442,即使它更新的表与调用触发器的表不同

llmtgqce  于 2023-04-10  发布在  Mysql
关注(0)|答案(1)|浏览(144)

我正在尝试优化我的查询,其中一部分是在它自己的列中存储一个值,如“评论数量”,而不是每次都使用COUNT()。为此,我计划在“评论”表中创建几个触发器。在插入/删除时,它将分别更新posts.numComments列+/- 1。
然而,触发器是我的问题所在,我得到了这个错误:

General error: 1442 Can't update table 'posts' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我理解这意味着你不能更新调用触发器的表,但是据我所知,触发器的任何部分都不会试图改变它被调用的表;“comments”表。它应该只更新posts表
导致此错误的触发器:

CREATE TRIGGER `increase cache` AFTER INSERT ON `comments`
 FOR EACH ROW UPDATE `posts` SET `numComments`= (numComments + 1) WHERE postID = NEW.postID

真正让我困惑的是,我也在numLikes上使用这种方法,并且有一个几乎相同的触发器,运行时没有任何错误:

CREATE TRIGGER `increase cached likes` AFTER INSERT ON `likes`
 FOR EACH ROW UPDATE `posts` SET `numlikes`= (numlikes + 1) WHERE postID = NEW.postID

在post表上没有触发器,在运行DELETE的comments表上只有一个触发器,所以我真的不知道是什么导致了这个问题。任何帮助都将不胜感激!
如果有帮助,我使用MySQL集群(我知道触发器不会在节点之间自动复制,这不是我的问题)
我试着在网上找到一个解决这个问题的方法,但我找不到任何人有这个问题。应该发生的是,当一个评论被添加到评论表时,被评论的帖子的numComments列应该增加一个,但我一直得到上面的错误。

at0kjp5o

at0kjp5o1#

这可能是由INSERT INTO comments查询从posts中选择引起的。

相关问题