Layer 06

Auto increment in oracle

questo indirizzo in mini howto per l’autoincrement proprio delle primary key. Diciamo che è un workaround piuttosto che un howto vero e proprio, vado ora a tradurlo e a mettere le dovute considerazioni: In teoria: In oracle esistono le “sequence” che altro non sono che dei mini contenitori che segnano un valore, il suo successivo, il precedente e l’ultimo utilizzato. Va da se che i campi autoincrementali non sono altro che delle sequenze, non mi addentro molto nel discorso perchè non so come siano sviluppati nell’engine di MySQL. Basterebbe creare una sequenza e tramite un trigger assegnare il valore :nextval della sequenza al campo chiave primaria ogni volta che si aggiunge un record. In definitiva l’evento scatenante è l’inserimento di un record, il valore da assegnare è quello successivo all’ultimo utilizzato. In pratica: Nella pratica vediamo degli esempi che sono molto più esplicativi di mille parole. Creiamo innanzitutto una tabella con chiave primaria numerica:

   create table test (
     id number,
     testdata varchar2(255),
     constraint PK_ID primary key (id)
   );
Id è la nostra chiave primaria, come specificato nel constraint. Ora creiamo invece la sequenza relariva all’id della nostra tabella:
   create sequence test_seq      start with 1      increment by 1      nomaxvalue   ;
Start with significa che la sequenza partirà dal valore 1, nel caso in cui volessimo collegare una sequenza ad una tabella con dei valori già inseriti basterà specificare a mano il valore o tramite select come questo:
   select max(id)
   from test
Increment by 1 invece specifica di quanto incrementare la sequenza, il valore 1 è di default quindi potrebbe essere omessa l’intera clausola. Nomax value è il valore massimo a cui può arrivare la sequenza. A questo punto dobbiamo creare il trigger che legerà l’evento insert nella tabella al prossimo valore della sequenza:
create trigger test_trigger
before insert on test
for each row
begin
       select test_seq.nextval into :new.id from dual;
end;
Before insert indica che prima dell’evento insert il trigger eseguirà qualcosa, nel nostro caso specifico per ogni riga inserita (for each row) assegna il nuovo valore di id. Basta far delle prove e ad ogni valore inserito verrà assegnato un id nuovo con valore superiore di uno al precedente. Se nell’istruzione di insert specifichiamo anche il valore di Id alla chiave primaria verrà assegnato il valore specificato Piccoli tips per controlalre sequence e trigger:

select sequence_name from user_sequences; select trigger_name from user_triggers; visualizza la sequenza ed il trigger

drop sequence test_seq; drop trigger test_trigger; Elimina la sequenza ed il trigger

alter trigger test_trigger disable; alter trigger test_trigger enable; Abilita e disabilita il trigger.

]]>