为什么我不能在同一个表上的触发器调用的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$$
它给出了同样的错误/为什么???
答
已经错误消息说,你不应该修改表中修改表时发射的扳机。在这种情况下,您尝试插入每当有人插入一个学生一次额外的学生......
看起来打算成立新的学生只是年龄。要做到这一点,你可以使用new
变量,它指向记录插入:
delimiter $$
create trigger genCode BEFORE INSERT on student for each row
BEGIN
NEW.age = 12;
END$$
或者你可以简单地设置为列的默认值:
ALTER TABLE student MODIFY COLUMN age INT NOT NULL DEFAULT 12;
在我看来,最好不要这样做,但。不是每个学生进入时都是12,触发器只能用于执行最重要的业务逻辑。我从十年的经验,因为在某些时候你要删除此默认难触发这个方法使维护在未来,知道了,代码会在意想不到的地方断裂。
如果你想要一个这样的功能,最好声明一个默认的年龄(12),并在你的UI中预先填充。
错误消息已经说明了:你不应该修改表中修改表时发射的扳机。在这种情况下,您每次插入学生时都会尝试插入额外的学生... – GolezTrol