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

时间:2012-05-23 20:48:24

标签: mysql triggers

您好,每个人:)!

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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