大家好 :)!
我会尽量保持这个简单,基本上,我有一个通过parent_id列引用自己的表 . 表中的每一行都可以有一个父级,并且可以通过count列计算它拥有的子项数 . 基本上我正在尝试做的是让触发器在必要时更新每个父行的计数列
问题是当调用insert触发器中的更新操作时,将调用更新触发器 . 然后我得到:
"General error: 1442 Can't update table 'term_taxonomies' in stored function/trigger because it is already used by statement which invoked this stored function/trigger" .
有任何想法吗?
实际代码:
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$$
1 回答
所有mysql触发器都在与触发语句相同的事务中执行 .
您希望使用
SET NEW.assocItemCount
语法进行更新,而不是在基础表上执行UPDATE
语句 .Edit :但是,在你的情况下这是不可能的,因为你正在更新同一个表中的另一行,这是mysql触发器中最难做的事情 . 抱歉 .
您将不得不更改您的架构 . 从表中取出
assocItemCount
,创建一个仅包含term_taxonomy_id
和assocItemCount
的新表,并使用查询中的UPDATE
语句对其进行更新 . 如果查询需要使用原始模式,也可以使用连接这两个表的视图来隐藏此详细信息 .或者,如果您的数据库中根本没有
assocItemCount
,您仍然可以在任何查询中计算它,并且您的数据库将比现在更好地规范化 .