我有以下触发器:
CREATE DEFINER=root@localhost TRIGGER after_insert_student AFTER INSERT ON
students FOR EACH ROW BEGIN
SET @cateID := NEW.ID ;
IF @cateID IS NOT NULL THEN
SELECT right(max(id), 3) INTO @firstid FROM students LIMIT 1;
SET @IDFOR = @firstid+1;
SET @DATEID = DATE_FORMAT(NOW(),'%y%d%m');
INSERT INTO students (CONCAT(@DATEID, @IDFOR), DATENEW)
VALUES(@IDFOR, NOW() );
END IF;
END
ERROR:
错误1442:1442:无法更新存储的“学生”表 函数/触发器,因为它已被调用的语句使用 这个存储的函数/触发器。
答案 0 :(得分:1)
您无法更新调用触发器的表(学生):
在存储的函数或触发器中,不允许修改a 已经被使用(用于读或写)的表 调用函数或触发器的语句。
这样做会产生错误1442:
Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
如果您只需要根据同一个表或其他表中的先前条目设置字段值(使用SELECT
)。您可以使用BEFORE INSERT ON students
触发器,这样您就可以使用NEW
运算符设置/更新/编辑字段值。
答案 1 :(得分:0)
是不是因为你实际上是在插入触发器之前进行插入?
您是否不会将插件留给发射它的事件?
您将根据刚刚插入同一张桌子的学生插入另一名学生
尝试使用AFTER INSERT ON
重写,然后更新刚刚创建的记录。
答案 2 :(得分:0)
错误消息全部显示:您的触发器在学生表上插入事件之前处理,并且您尝试从触发器向学生表中插入新记录。哪个会再次引发这个非常触发,这会在同一个表中插入另一行......我还能继续吗?
将其更改为插入后触发器或使用NEW.fieldname = ...语法,您可以修改插入的值。