错误代码:1442。无法在存储的函数/触发器中更新表'学生'

时间:2015-10-22 03:55:00

标签: mysql sql triggers mysql-error-1442

我有以下触发器:

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

ERROR:

  

错误代码:1442。无法更新存储的表'学生'   函数/触发器,因为它已经被语句使用了   调用了这个存储的函数/触发器。

4 个答案:

答案 0 :(得分:0)

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

为此,请参阅this link

答案 1 :(得分:0)

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

答案 2 :(得分:0)

问题在于你不能写出像

这样的语句
INSERT INTO students SET ID = @NEWID;

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

INSERT INTO students values (@NEWID);

应该有用,或者如果你想坚持你的SET ID,那么尝试写一些类似

的东西
UPDATE students SET ID = @NEWID;

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

答案 3 :(得分:0)

解决方案:使其成为BEFORE UPDATE ON触发器,并使用NEW运算符,它将完成这项工作 - 因为你想要的只是新ID是NULL,设置为001:< / p>

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;

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

  

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

这样做会产生错误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.