0

我已经阅读了很多关于此错误的文章,但似乎没有找到解决我的问题的方法。

据我了解,我的代码中没有无限循环或递归触发器调用。但我仍然不断收到此错误(1442)。我已经阅读了很多关于触发器如何起作用以及偶然制作递归触发器系统是多么容易,但我不明白错误在哪里。此外,人们错误地在启动触发器的同一行上使用了 INSERT/UPDATE,在我的情况下并非如此。

我怎么解决这个问题?如果您有任何具体问题,请务必问我。我真的很挣扎,需要帮助 - 期待回复

这是我的触发器和过程:(只是提到我不使用任何 DELIMITER,因为我使用的是 MySQL Workbench,并且没有必要在那里使用 DELIMITER)

1)触发:

BEFORE INSERT ON `dim_content` FOR EACH ROW
BEGIN
    INSERT INTO sequence (increment) VALUE (new.sys_increment);
END

2)触发:

BEFORE INSERT ON `sequence` FOR EACH ROW
BEGIN
    DECLARE z INT(15);
    DECLARE w VARCHAR(10);
    SET z = NEW.increment;
    CALL alpha_numeric(z, w);
    UPDATE dim_content SET content_id = w WHERE sys_increment = z;
END

3) 程序 alpha_numeric():

PROCEDURE `alpha_numeric`(INOUT x INT(7), OUT y VARCHAR(10))
BEGIN
    DECLARE y CHAR(7);
    WHILE EXISTS(SELECT * FROM sequence WHERE increment = x) DO
    SET x = x+1;
    END WHILE;
    IF (x < 9999) THEN
    BEGIN
    SET y = CONCAT('A', convert(x, CHAR(4)));
    END;
    /* There are more elif statements but that's not point of the problem */
END;

我的逻辑的实际顺序如下:

INSERT INTO dim_content -> 在 dim_content 上触发 BEFORE INSERT -> INSERT INTO 序列 -> 在序列上触发 BEFORE INSERT -> CALL alpha_numeric() -> 在序列上触发 BEFORE INSERT(继续)-> 更新 dim_content

4

1 回答 1

0

你得到的错误:

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

问题在于您的第二个触发器:

BEFORE INSERT ON `sequence` FOR EACH ROW
BEGIN
    DECLARE z INT(15);
    DECLARE w VARCHAR(10);
    SET z = NEW.increment;
    CALL alpha_numeric(z, w);
    UPDATE dim_content SET content_id = w WHERE sys_increment = z;
END

最后一条语句更新dim_content表。但是第二个触发器被执行,因为您在dim_content表中插入了一条记录。

MySQL禁止这种行为,因此出现错误。

文档说

触发器可以访问表吗?

触发器可以访问自己表中的旧数据和新数据。触发器也可以影响其他表,但不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。

于 2017-04-11T09:55:39.797 回答