我创建了一个触发器来管理auto_increment,但由于我不知道它总是向我显示这个错误:超出了最大递归SQL级别数(50)。
CREATE OR REPLACE TRIGGER auto_increment BEFORE INSERT ON people FOR EACH ROW
DECLARE
mat number;
namm varchar(40);
coun number;
BEGIN
namm:=:new.name;
IF inserting() THEN T
SELECT COUNT(*) INTO coun FROM people;
IF coun = 0 THEN
INSERT INTO people VALUES(100,namm);
ELSE
SELECT MAX(:old.matricule+1) INTO mat FROM people;
INSERT INTO people (matricule,name) VALUES(mat,namm);
END IF;
END IF;
END;
答案 0 :(得分:2)
它是递归的,因为每次将记录插入PEOPLE时,你的触发器会在PEOPLE中插入另一条记录,这会导致触发器触发并将另一条记录插入PEOPLE,这样......你就明白了。
在Oracle触发器中,您只需设置:NEW值即可更改插入的内容,例如:
:NEW.matricule := 100;
但是,您的触发器仍然无效,因为它从同一个表中选择,这将导致“表正在变异”异常。
这里最好的答案是使用序列 - 它们旨在避免这些问题并提供最佳性能。但是,如果您真的需要此增量功能,请在不插入触发器之前执行此操作。