2011-11-30 94 views
11

我從來沒有在Oracle中創建觸發器,所以我正在尋找某個方向。Oracle觸發器創建自動編號

我想創建一個觸發器,如果​​ID不在insert語句中,則會將ID加1。

ID應該從10000開始,當插入一條記錄時,下一個ID應該是10001.如果insert語句包含一個ID,它應該覆蓋自動增量。

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird') 

應該是這樣的:

名姓ID

Micahel約旦10000

拉里 - 伯德10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000) 

應該是這樣的:

名姓ID

Micahel約旦10000

拉里 - 伯德10001

皮蓬50000

回答

24

這樣的事情將在11g中

CREATE SEQUENCE t1_id_seq 
    start with 10000 
    increment by 1; 

CREATE TRIGGER trigger_name 
    BEFORE INSERT ON t1 
    FOR EACH ROW 
DECLARE 
BEGIN 
    IF(:new.id IS NULL) 
    THEN 
    :new.id := t1_id_seq.nextval; 
    END IF; 
END; 
工作

如果您使用的是較早的版本錫永,你需要做一個SELECT INTO從序列

CREATE TRIGGER trigger_name 
    BEFORE INSERT ON t1 
    FOR EACH ROW 
DECLARE 
BEGIN 
    IF(:new.id IS NULL) 
    THEN 
    SELECT t1_id_seq.nextval 
     INTO :new.id 
     FROM dual; 
    END IF; 
END; 

要知道,甲骨文序列不是無間隙得到下一個值。因此,出於各種原因,特定值將被完全跳過。如果數分鐘,數小時或數天後完成,則第一次插入的ID可能爲10000,第二次插入的ID可能爲10020。

另外,請注意,Oracle不支持像MySQL那樣在VALUES子句中指定多行。因此,而不是

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird') 

你需要兩個單獨的INSERT語句

insert into t1 (firstname, lastname) values ('Michael','Jordan'); 
insert into t1 (firstname, lastname) values ('Larry','Bird'); 
+0

[https://github.com/miklagard/oracle-table-creator](https://github.com/miklagard/oracle-table-creator) – cem

2

我會推薦給這個觸發器與觸發器本身條件代碼,而不是在SQL塊。

CREATE OR REPLACE TRIGGER your_trigger 
BEFORE INSERT ON your_table 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
WHEN (new.id IS NULL) 
    BEGIN 
    SELECT your_sequence.nextval 
    INTO :new.id 
    FROM dual; 
    END; 
/

使用此解決方案時,只有條件匹配(id爲null)纔會執行觸發器。

否則,觸發器總是執行並且塊檢查id是否爲空。數據庫必須執行不能爲空值的SQL塊。