【问题标题】:MySQL Error 1442 with two triggers and a stored procedure带有两个触发器和一个存储过程的 MySQL 错误 1442
【发布时间】:2017-09-06 13:58:48
【问题描述】:

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

据我所知,我的代码中没有无限循环或递归触发器调用。但我仍然不断收到此错误(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() -> 在序列上触发之前插入(继续)-> UPDATE dim_content

【问题讨论】:

  • 完整的错误信息是什么?
  • 错误 1442:1442:无法更新存储函数/触发器中的表“dim_content”,因为它已被调用此存储函数/触发器的语句使用。但我无法理解它,因为一开始我插入到表中,然后我更新了它,我没有一个更新触发器可以使它递归

标签: mysql stored-procedures recursion triggers mysql-error-1442


【解决方案1】:

你得到的错误:

ERROR 1442: 1442: Can't update table 'dim_content' in stored 函数/触发器,因为它已被调用的语句使用 这个存储的函数/触发器。

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

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 禁止这种行为,因此出现错误。

The documentation says:

触发器可以访问表吗?

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

【讨论】:

  • 好的。这是问题的根源,但我该如何解决?如果我需要向具有 AI 列的表中插入一些东西,但我需要一个数据库中心 AI。所以我将它发送到一个名为 sequence 的表中,其中包含所有以前的 AI-s。现在,一个过程需要以我需要的形式为我创建一个唯一 ID(作为 OUT 参数),所以我将它发送回调用该过程的触发器。如果不允许修改这些表,如何将其插入/更新到另一个表,甚至是触发该过程的同一个表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多