我读了很多关于这个错误的文章,似乎没有找到解决我的问题的方法。
据我所知,我的代码中没有无限循环或递归触发器调用。但是我仍然得到这个错误(1442)。我读了很多关于触发器是如何工作的,以及意外地创建一个递归触发器系统是多么容易,但我不明白错误在哪里。另外,人们错误地在启动触发器的同一行上使用了INSERT/UPDATE,在我的例子中并非如此。
我该如何解决这个问题?如果你有任何具体的问题,一定要问我。我真的很挣扎,需要帮助-期待回复
下面是我的触发器和过程:(只需提一下,我没有使用任何分隔符,因为我使用的是MySQL工作台,并且没有必要在那里使用分隔符)
1)触发器:
BEFORE INSERT ON `dim_content` FOR EACH ROW
BEGIN
INSERT INTO sequence (increment) VALUE (new.sys_increment);
END2)触发器:
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;
END3)过程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 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
发布于 2017-04-11 17:55:40
你得到的错误是:
错误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禁止,因此出现错误。
可以触发访问表吗?
触发器可以访问它自己的表中的旧数据和新数据。触发器也可以影响其它表,但不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。
https://stackoverflow.com/questions/43341553
复制相似问题