当从mysql中的after insert触发器触发更新后触发器时,如何使其工作?

当从mysql中的after insert触发器触发更新后触发器时,如何使其工作?,mysql,triggers,Mysql,Triggers,大家好:) 我会尽可能地简单,基本上,我有一个表,它通过parent_id列引用自己。表中的每一行都可以有一个父行,并且可以通过count列记录它有多少子行。所以本质上我要做的是让触发器在必要时更新每个父行的count列 问题是在调用insert触发器中的update操作时调用update触发器。然后我得到: “常规错误:1442无法更新存储函数/触发器中的表'term_taxonomies',因为调用此存储函数/触发器的语句已经使用了它。” 有什么想法吗 实际代码: TRIGGER `dbna

大家好:)

我会尽可能地简单,基本上,我有一个表,它通过parent_id列引用自己。表中的每一行都可以有一个父行,并且可以通过count列记录它有多少子行。所以本质上我要做的是让触发器在必要时更新每个父行的count列

问题是在调用insert触发器中的update操作时调用update触发器。然后我得到:

“常规错误:1442无法更新存储函数/触发器中的表'term_taxonomies',因为调用此存储函数/触发器的语句已经使用了它。”

有什么想法吗

实际代码:

TRIGGER `dbname`.`ai_term_taxonomies` AFTER INSERT ON `dbname`.`term_taxonomies` FOR EACH ROW BEGIN IF NEW.parent_id NOT 0 THEN UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount + 1) WHERE termTax.term_taxonomy_id = NEW.parent_id; END IF; END$$ CREATE TRIGGER `dbname`.`au_term_taxonomies` AFTER UPDATE ON `dbname`.`term_taxonomies` FOR EACH ROW BEGIN IF NEW.parent_id NOT OLD.parent_id THEN IF NEW.parent_id NOT 0 THEN UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount + 1) WHERE termTax.term_taxonomy_id = NEW.parent_id; END IF; IF OLD.parent_id NOT 0 THEN UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount - 1) WHERE termTax.term_taxonomy_id = OLD.parent_id; END IF; END IF; END$$ 触发器`dbname`.`ai\U术语\U分类法` 在“dbname”上插入之后。`term\u分类法` 每行 开始 如果NEW.parent\u id不是0,则 将术语_分类更新为术语税集AssociItemCount=(AssociItemCount+1) 其中termTax.term\u taxonomy\u id=NEW.parent\u id; 如果结束; 结束$$ 创造 触发器`dbname`.`au\u term\u分类法` 更新'dbname`.'term_分类法之后` 每行 开始 如果NEW.parent\u id不是OLD.parent\u id,则 如果NEW.parent\u id不是0,则 将术语_分类更新为术语税集AssociItemCount=(AssociItemCount+1) 其中termTax.term\u taxonomy\u id=NEW.parent\u id; 如果结束; 如果OLD.parent\u id不是0,则 将术语_分类更新为termTax集AssociItemCount=(AssociItemCount-1) 其中termTax.term\u taxonomy\u id=OLD.parent\u id; 如果结束; 如果结束; 结束$$
所有mysql触发器都在与触发语句相同的事务中执行

您希望使用
SET NEW.assocItemCount
语法进行更新,而不是对基础表执行
update
语句

编辑:但是,在您的情况下,这是不可能的,因为您正在更新同一表中的不同行,这是mysql触发器中最难做的事情。对不起

您必须更改您的模式。从表中取出
assocItemCount
,创建一个只包含
term\u taxonomy\u id
assocItemCount
的新表,并使用查询中的
update
语句更新该表。如果查询需要使用原始模式,也可以使用连接这两个表的视图来隐藏此详细信息


或者,如果您的数据库中根本没有
assocItemCount
,您仍然可以在任何查询中计算它,并且您的数据库将比现在更加规范化。

我想我明白您的意思,但在本例中,我们正在更新另一行,那么,我们如何告诉引擎更新该特定行呢?啊!我明白你的意思!但在这种情况下,update触发器有两个用途。保持插入计数和更新计数。我是否可以使用SET NEW.assocItemCount(它们是您建议的方式)并在同一语句中指定WHERE子句?@user437498-很遗憾,您不能。您必须更改您的模式。从表中取出
assocItemCount
,创建一个只包含
term\u taxonomy\u id
assocItemCount
的新表,并使用查询中的
update
语句更新该表。aaaaahh!!看来我别无选择。谢谢Jirka:-D!