2011-11-30 14 views
11

Non ho mai creato un trigger in Oracle prima quindi sto cercando una direzione.Trigger Oracle per creare un autonumber

Vorrei creare un trigger che incrementi un ID di uno se l'ID non è nell'istruzione di inserimento.

L'ID deve iniziare a 10000 e, quando viene inserito un record, l'ID successivo deve essere 10001. Se l'istruzione di inserimento contiene un ID, è necessario sovrascrivere l'incremento automatico.

cioè

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

dovrebbe essere simile:

Nome Cognome id

Micahel Jordan 10000

Larry Bird 10001

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

dovrebbe essere simile:

Nome Cognome id

Micahel Jordan 10000

Larry Bird 10001

Scottie Pippen 50000

risposta

24

Qualcosa di simile funzionerà su 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; 

Se sei su un ver precedente Sion, avrete bisogno di fare un SELECT INTO per ottenere il valore successivo dalla sequenza

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; 

Essere consapevoli del fatto che le sequenze di Oracle non sono privi di gap. Quindi è del tutto possibile che determinati valori vengano saltati per una serie di motivi. Il primo inserto può avere un ID di 10000 e il secondo può avere un ID di 10020 se ha fatto minuti, ore o giorni dopo.

Inoltre, tenere presente che Oracle non supporta la specifica di più righe nella clausola VALUES come fa MySQL. Quindi, piuttosto che

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

avresti bisogno di due istruzioni INSERT separati

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

Suggerirei di codificare questo trigger con una condizione sul grilletto se stessa, non nel blocco SQL.

Con questa soluzione il trigger viene eseguito solo se la condizione corrisponde (id è null).

In caso contrario, il trigger viene sempre eseguito e il blocco verifica se l'ID è nullo. Il DB deve eseguire il blocco SQL che non fa nulla su valori non nulli.

Problemi correlati