Incremento automatico in Oracle senza utilizzare un trigger

Quali sono gli altri modi per ottenere l’auto-incremento in oracle diverso dall’uso di trigger?

Per quanto posso ricordare dai miei giorni Oracle, non è ansible ottenere colonne Incremento automatico senza utilizzare TRIGGER. Qualsiasi soluzione là fuori per fare la colonna di incremento automatico coinvolge TRIGGER e SEQUENCE (presumo che tu lo sappia già, quindi le osservazioni di non trigger).

È ansible creare e utilizzare sequenze di oracle. La syntax e i dettagli sono disponibili all’indirizzo http://www.techonthenet.com/oracle/sequences.php

Leggi anche l’articolo http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html per comprendere le limitazioni relative ad AUTONUMBER in altri RDBMS

Se non hai bisogno di numeri sequenziali ma solo di un ID univoco, puoi utilizzare un DEFAULT di SYS_GUID (). Vale a dire:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() ) 

Un trigger per ottenere il valore successivo da una sequenza è il modo più comune per ottenere un equivalente di AUTOINCREMENT:

 create trigger mytable_trg before insert on mytable for each row when (new.id is null) begin select myseq.nextval into :new.id from dual; end; 

Non hai bisogno del trigger se controlli gli inserti – usa la sequenza nell’istruzione insert:

 insert into mytable (id, data) values (myseq.nextval, 'x'); 

Questo potrebbe essere nascosto all’interno di un pacchetto API, in modo che il chiamante non debba fare riferimento alla sequenza:

 mytable_pkg.insert_row (p_data => 'x'); 

Ma usare il grilletto è più “trasparente”.

Crea una sequenza:

 create sequence seq; 

Quindi per aggiungere un valore

 insert into table (id, other1, other2) values (seq.nextval, 'hello', 'world'); 

Nota: cerca i documenti di Oracle per ulteriori opzioni sulle sequenze (valore iniziale, incremento, …)

Da 12c è ansible utilizzare una colonna Identity , che rende esplicito il collegamento tra la tabella e l’auto-incremento; non è necessario un trigger o una sequenza. La syntax sarebbe:

 create table  (  generated as identity ); 

Oltre ad es. La risposta di FerranB:
Probabilmente vale la pena menzionare questo, al contrario di come auto_incement funziona in MySQL:

  • le sequenze funzionano a livello di database, quindi possono essere utilizzate per più tabelle e i valori sono univoci per l’intero database
  • pertanto: il troncamento di una tabella non reimposta la funzionalità “autoincremento”
  • Se non si desidera realmente utilizzare una soluzione basata sul trigger, è ansible ottenere la funzionalità di incremento automatico con un approccio programmatico, ottenendo il valore della chiave di incremento automatico con il metodo getGeneratedKeys() .

    Ecco uno snippet di codice per la tua considerazione:

     Statement stmt = null; ResultSet rs = null; stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE); stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTable"); stmt.executeUpdate("CREATE TABLE autoIncTable (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); stmt.executeUpdate("INSERT INTO autoIncTable (dataField) " + "values ('data field value')", Statement.RETURN_GENERATED_KEYS); int autoIncKeyFromApi = -1; rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // do stuff here } rs.close(); 

    fonte: http://forums.oracle.com/forums/thread.jspa?messageID=3368856

     SELECT max (id) + 1 FROM table