【发布时间】:2013-07-26 15:42:31
【问题描述】:
我正在开发一个代码库,该代码库具有以下类型的模式,用于为表生成代理键。
create or replace
TRIGGER TEST_TRIG
BEFORE INSERT OR UPDATE
ON my_table
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
IF NVL(:NEW.column1, 0) = 0 THEN
SELECT my_table_seq.NEXTVAL
INTO :NEW.column1
FROM dual;
END IF;
END IF;
END;
以及调用此代码的 PL/SQL 逻辑,
begin
insert into my_table(0);
end;
我的问题是触发器需要什么? 为什么不做一个,
insert into my_table(my_table_seq.next_val)
然后收工? 任何见解将不胜感激。谢谢。
【问题讨论】:
-
您还可以省略序列并在常规表中跟踪分配的 ID。当您拥有可以节省工作并防止人为错误的功能时,您只需使用它;-)
-
人们可能还想知道为什么当正文忽略更新时它是一个
INSERT OR UPDATE触发器。 -
在实践中,您可能有更多的列 - 这对于在 INSERT/ 中省略这一列的情况会很好
-
至于问题,我认为主要是不必调试在插入时意外使用错误序列的问题。去过那里:-/
-
Re: NOT NULL 和 UNIQUE - 这些是对列的很好的约束,但它们不会填充它,这就是这里的重点。此外,如果您在触发器中执行此操作,您不必一直调试程序员忘记添加“sequence.NEXT_VAL”调用,或使用错误序列,或找到键列的最大值和加 1,或者编码人员将设法弄错的所有其他方式。这是拥有幸福生活的秘诀 - 一次完成,一次触发,然后完成。分享和享受。