您好,每个人:)!
我会尽量保持这个简单,基本上,我有一个通过parent_id列引用自己的表。表中的每一行都可以有一个父级,并且可以通过count列计算它拥有的子项数。基本上我正在尝试做的是让触发器在必要时更新每个父行的计数列
问题是当调用insert trigger中的更新操作时会调用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$$
答案 0 :(得分:0)
所有mysql触发器都在与触发语句相同的事务中执行。
您希望使用SET NEW.assocItemCount
语法进行更新,而不是在基础表上执行UPDATE
语句。
编辑:但是,在您的情况下,这是不可能的,因为您正在更新同一个表中的另一行,这是mysql触发器中最难做的事情。遗憾。
您必须更改架构。从表中取出assocItemCount
,创建一个仅包含term_taxonomy_id
和assocItemCount
的新表,并使用查询中的UPDATE
语句对其进行更新。如果查询需要使用原始模式,也可以使用连接这两个表的视图来隐藏此详细信息。
或者,如果您的数据库中根本没有assocItemCount
,您仍然可以在任何查询中计算它,并且您的数据库将比现在更好地规范化。