Aumento automático en Oracle sin usar un disparador

¿Cuáles son las otras formas de lograr el autoincremento en Oracle además del uso de desencadenantes?

Por lo que puedo recordar de mis días en Oracle, no puedes lograr columnas de Aumento Automático sin usar TRIGGER. Cualquier solución que exista para hacer una columna de incremento automático implica ACTIVAR y SECUENCIAR (supongo que ya sabes esto, por lo tanto, los comentarios sin activación).

Puede crear y usar secuencias de oracle. La syntax y los detalles están en http://www.techonthenet.com/oracle/sequences.php

Lea también el artículo http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html para comprender las limitaciones con respecto a AUTONUMBER en otros RDBMS

Si no necesita números secuenciales sino solo una ID única, puede usar un DEFAULT de SYS_GUID (). Es decir:

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

Un desencadenante para obtener el siguiente valor de una secuencia es la forma más común de lograr un equivalente al AUTOINCREMENTO:

 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; 

No necesita el desencadenante si controla las inserciones, solo use la secuencia en la instrucción de inserción:

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

Esto podría estar oculto dentro de un paquete API, de modo que la persona que llama no necesita hacer referencia a la secuencia:

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

Pero usar el disparador es más “transparente”.

Crea una secuencia:

 create sequence seq; 

Entonces para agregar un valor

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

Nota: busque los documentos de Oracle para obtener más opciones sobre las secuencias (valor de inicio, incremento, …)

Desde 12c puede usar una columna de identidad , lo que hace explícito el enlace entre la tabla y el autoincremento; no hay necesidad de un disparador o una secuencia. La syntax sería:

 create table  (  generated as identity ); 

Además de, por ejemplo, la respuesta de FerranB:
Probablemente valga la pena mencionar que, a diferencia de cómo funciona auto_incement en MySQL:

  • las secuencias funcionan en toda la base de datos, por lo que se pueden usar para varias tablas y los valores son únicos para toda la base de datos
  • por lo tanto: truncar una tabla no restablece la funcionalidad de “autoincrement”
  • Si realmente no desea utilizar una solución “basada en disparadores”, puede lograr la funcionalidad de getGeneratedKeys() con un enfoque programático, obteniendo el valor de la clave de incremento automático con el método getGeneratedKeys() .

    Aquí hay un fragmento de código para su consideración:

     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(); 

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

     SELECT max (id) + 1 FROM table