1

我有以下触发器:

CREATE DEFINER=root@localhost TRIGGER after_insert_student after INSERT ON 
students FOR EACH ROW BEGIN 
    SET @NEWID := NEW.ID ;
if @NEWID IS NOT NULL THEN     
     INSERT INTO students SET ID = @NEWID;
else
     INSERT INTO students SET ID = 001;
END IF
END

错误:

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

4

4 回答 4

0

您可能需要一个 BEFORE INSERT 触发器。然后,无需更新表,只需将所需的值分配给 NEW.ID。

于 2015-10-22T04:42:17.957 回答
0

问题是你不能写像

INSERT INTO students SET ID = @NEWID;

因为它需要知道要插入哪些列,或者如果未指定列,则插入所有列值等。

INSERT INTO students values (@NEWID);

应该可以工作,或者如果你想坚持你的SET ID然后尝试写一些类似的东西

UPDATE students SET ID = @NEWID;

希望这可以指导您解决问题。

于 2015-10-22T06:16:52.110 回答
0

解决方案:将其设置为 BEFORE UPDATE ON 触发器,并使用 NEW 运算符,它会完成这项工作 - 如果新 ID 为 NULL,请将其设置为 001:

CREATE DEFINER=root@localhost TRIGGER after_insert_student 
BEFORE INSERT ON students 
FOR EACH ROW BEGIN 
    IF NEW.ID IS NULL THEN     
        SET ID = 001;
    END IF;
END;

原因:您无法更新调用触发器的表(学生):

在存储的函数或触发器中,不允许修改调用函数或触发器的语句已经使用(用于读取或写入)的表。

这样做会产生错误 1442:

Error Code: 1442
Can't update table 'chatroompost' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
于 2017-06-14T10:06:36.860 回答
0

当 INSERT 触发器触发时,您不能更改表。INSERT 可能会执行一些可能导致死锁的锁定。此外,从触发器更新表会导致相同的触发器在无限递归循环中再次触发。这两个原因都是 MySQL 阻止您这样做的原因。

为此,请参考此链接

于 2015-10-22T04:03:39.820 回答