0

大家好 :)!

我会尽量保持它尽可能简单,基本上,我有一个通过 parent_id 列引用自身的表。表中的每一行都可以有一个父级,并且可以通过计数列来计算它有多少个子级。所以基本上我想做的是让触发器在必要时更新每个父行的计数列

问题是当调用插入触发器中的更新操作时会调用更新触发器。然后我得到:

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

有任何想法吗?

实际代码:

触发器`dbname`.`ai_term_taxonomies`
在 `dbname` 上插入之后。`term_taxonomies`
每一行
开始
    如果 NEW.parent_id 不是 0 那么
        将 term_taxonomies 更新为 termTax SET assocItemCount = (assocItemCount + 1)
        WHERE termTax.term_taxonomy_id = NEW.parent_id;
    万一;

结束$$

创造
触发器`dbname`.`au_term_taxonomies`
更新后`dbname`。`term_taxonomies`
每一行
开始

    如果 NEW.parent_id 不是 OLD.parent_id 那么
        如果 NEW.parent_id 不是 0 那么
            将 term_taxonomies 更新为 termTax SET assocItemCount = (assocItemCount + 1)
            WHERE termTax.term_taxonomy_id = NEW.parent_id;
        万一;
        如果 OLD.parent_id 不是 0 那么
            将 term_taxonomies 更新为 termTax SET assocItemCount = (assocItemCount - 1)
            WHERE termTax.term_taxonomy_id = OLD.parent_id;
        万一;
    万一;

结束$$
4

1 回答 1

0

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

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

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

您将不得不更改您的架构。从表中取出,创建一个只包含andassocItemCount的新表,并使用查询中的语句更新它。如果查询需要使用您的原始模式,也可以使用连接这两个表的视图来隐藏此详细信息。term_taxonomy_idassocItemCountUPDATE

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

于 2012-05-23T21:01:06.190 回答