首页 文章

如何从mysql中的插入后触发器触发后更新触发器工作?

提问于
浏览
0

大家好 :)!

我会尽量保持这个简单,基本上,我有一个通过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 回答

  • 0

    所有mysql触发器都在与触发语句相同的事务中执行 .

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

    Edit :但是,在你的情况下这是不可能的,因为你正在更新同一个表中的另一行,这是mysql触发器中最难做的事情 . 抱歉 .

    您将不得不更改您的架构 . 从表中取出 assocItemCount ,创建一个仅包含 term_taxonomy_idassocItemCount 的新表,并使用查询中的 UPDATE 语句对其进行更新 . 如果查询需要使用原始模式,也可以使用连接这两个表的视图来隐藏此详细信息 .

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

相关问题