为什么我不能在同一个表上的触发器调用的SP中插入表?

问题描述:

我创建了一个名为student的表,其中包含触发器。我想通过SP将数据插入到此表中。当我执行SP(或正常插入记录到表)时,它会给我下面的错误。 “不能因为它已经使用由调用这个存储函数/触发语句存储函数/触发更新表‘学生’。”为什么我不能在同一个表上的触发器调用的SP中插入表?

这里是我的表:

CREATE TABLE IF NOT EXISTS `crd`.`student` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(255) NOT NULL, 
    `age` INT(11) NOT NULL, 
    `stuCode` VARCHAR(10) NOT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 45 
DEFAULT CHARACTER SET = utf8mb4 

我的触发是:

delimiter $$ 
create trigger genCode BEFORE INSERT on student for each row 
BEGIN 
INSERT INTO student SET student.age = 12; 
END$$ 

和SP是:

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetDetails`(IN `gage` INT, IN `gname` VARCHAR(255)) 
BEGIN 
INSERT INTO student (name,age) VALUES (gname,gage); 
select name from student where id=LAST_INSERT_id(); 
END 

请帮助解决这个问题。

更改我的触发号码添加到学生表stuCode列:

delimiter $$ 
create trigger genCode AFTER INSERT on student for each row 

BEGIN 
declare refno varchar(10); 
declare refnonew varchar(10); 
select refno=student.stuCode into refno FROM student where student.id=(select MAX(student.id) from student); 
if (refno is null) or (refno='') then 
    set refnonew='000000001'; 
    UPDATE student 
     SET student.stuCode = refnonew where student.id=LAST_INSERT_id(); 
end if; 
END$$ 

它给出了同样的错误/为什么???

+0

错误消息已经说明了:你不应该修改表中修改表时发射的扳机。在这种情况下,您每次插入学生时都会尝试插入额外的学生... – GolezTrol

已经错误消息说,你不应该修改表中修改表时发射的扳机。在这种情况下,您尝试插入每当有人插入一个学生一次额外的学生......

看起来打算成立新的学生只是年龄。要做到这一点,你可以使用new变量,它指向记录插入:

delimiter $$ 
create trigger genCode BEFORE INSERT on student for each row 
BEGIN 
    NEW.age = 12; 
END$$ 

MySQL trigger syntax

或者你可以简单地设置为列的默认值:

ALTER TABLE student MODIFY COLUMN age INT NOT NULL DEFAULT 12; 

MySQL alter table syntax

在我看来,最好不要这样做,但。不是每个学生进入时都是12,触发器只能用于执行最重要的业务逻辑。我从十年的经验,因为在某些时候你要删除此默认难触发这个方法使维护在未来,知道了,代码会在意想不到的地方断裂。

如果你想要一个这样的功能,最好声明一个默认的年龄(12),并在你的UI中预先填充。