¿Cómo crear una identificación con AUTO_INCREMENT en Oracle?

Resuelto Sushan Ghimire asked hace 12 años • 18 respuestas

Parece que no existe el concepto de AUTO_INCREMENT en Oracle, hasta la versión 11g inclusive.

¿Cómo puedo crear una columna que se comporte como incremento automático en Oracle 11g?

Sushan Ghimire avatar Jul 02 '12 22:07 Sushan Ghimire
Aceptado

No existen columnas "auto_increment" o "identity" en Oracle a partir de Oracle 11g . Sin embargo, puedes modelarlo fácilmente con una secuencia y un disparador:

Definición de tabla:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

Definición de disparador:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

ACTUALIZAR:

IDENTITYLa columna ahora está disponible en Oracle 12c:

create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

o especificar valores iniciales e incrementales, evitando también cualquier inserción en la columna de identidad ( GENERATED ALWAYS) (nuevamente, solo Oracle 12c+)

create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

Alternativamente, Oracle 12 también permite utilizar una secuencia como valor predeterminado:

CREATE SEQUENCE dept_seq START WITH 1;

CREATE TABLE departments (
  ID           NUMBER(10)    DEFAULT dept_seq.nextval NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));
Eugenio Cuevas avatar Jul 02 '2012 15:07 Eugenio Cuevas

SYS_GUIDdevuelve un GUID: una identificación global única. A SYS_GUIDes un RAW(16). No genera un valor numérico incremental.

Si desea crear una clave numérica incremental, querrá crear una secuencia.

CREATE SEQUENCE name_of_sequence
  START WITH 1
  INCREMENT BY 1
  CACHE 100;

Luego usarías esa secuencia en tu INSERTdeclaración

INSERT INTO name_of_table( primary_key_column, <<other columns>> )
  VALUES( name_of_sequence.nextval, <<other values>> );

O puede definir un disparador que complete automáticamente el valor de la clave principal usando la secuencia

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT name_of_sequence.nextval
    INTO :new.primary_key_column
    FROM dual;
END;

Si está utilizando Oracle 11.1 o posterior, puede simplificar un poco el disparador

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.primary_key_column := name_of_sequence.nextval;
END;

Si realmente quieres usarSYS_GUID

CREATE TABLE table_name (
  primary_key_column raw(16) default sys_guid() primary key,
  <<other columns>>
)
Justin Cave avatar Jul 02 '2012 15:07 Justin Cave

En Oracle 12c en adelante, podrías hacer algo como,

CREATE TABLE MAPS
(
  MAP_ID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

Y en Oracle (Pre 12c).

-- create table
CREATE TABLE MAPS
(
  MAP_ID INTEGER NOT NULL ,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

-- create sequence
CREATE SEQUENCE MAPS_SEQ;

-- create tigger using the sequence
CREATE OR REPLACE TRIGGER MAPS_TRG 
BEFORE INSERT ON MAPS 
FOR EACH ROW
WHEN (new.MAP_ID IS NULL)
BEGIN
  SELECT MAPS_SEQ.NEXTVAL
  INTO   :new.MAP_ID
  FROM   dual;
END;
/
Nisar avatar Jun 14 '2014 18:06 Nisar