我有以下触发器:
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。无法更新存储的表'学生' 函数/触发器,因为它已经被语句使用了 调用了这个存储的函数/触发器。
答案 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.