首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含两个触发器和一个存储过程的MySQL错误1442

问包含两个触发器和一个存储过程的MySQL错误1442
EN

Stack Overflow用户
提问于 2017-04-11 17:12:23
回答 1查看 260关注 0票数 0

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

据我所知,我的代码中没有无限循环或递归触发器调用。但是我仍然得到这个错误(1442)。我读了很多关于触发器是如何工作的,以及意外地创建一个递归触发器系统是多么容易,但我不明白错误在哪里。另外,人们错误地在启动触发器的同一行上使用了INSERT/UPDATE,在我的例子中并非如此。

我该如何解决这个问题?如果你有任何具体的问题,一定要问我。我真的很挣扎,需要帮助-期待回复

下面是我的触发器和过程:(只需提一下,我没有使用任何分隔符,因为我使用的是MySQL工作台,并且没有必要在那里使用分隔符)

1)触发器:

代码语言:javascript
复制
BEFORE INSERT ON `dim_content` FOR EACH ROW
BEGIN
    INSERT INTO sequence (increment) VALUE (new.sys_increment);
END

2)触发器:

代码语言:javascript
复制
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():

代码语言:javascript
复制
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 INSERT dim_content -> trigger BEFORE INSERT on dim_content -> INSERT INSERT on sequence -> trigger BEFORE sequence -> CALL alpha_numeric() -> trigger BEFORE INSERT on sequence (continues) -> UPDATE dim_content

EN

回答 1

Stack Overflow用户

发布于 2017-04-11 17:55:40

你得到的错误是:

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

问题出在你的第二个触发器:

代码语言:javascript
复制
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

可以触发访问表吗?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43341553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档