update - Aumento automático en Oracle sin usar un disparador
trigger oracle example (9)
¿Cuáles son las otras formas de lograr el autoincremento en Oracle además del uso de desencadenantes?
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:
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 sintaxis sería:
create table <table_name> ( <column_name> generated as identity );
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 oráculo. La sintaxis 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() )
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
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".
SELECT max (id) + 1
FROM table