¿Cómo crear un id con AUTO_INCREMENT en Oracle?

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 autoincremento en Oracle 11g?

Solución

No existen las columnas "auto_increment" o "identity" en Oracle a partir de Oracle 11g. Sin embargo, se puede modelar fácilmente con una secuencia y un trigger:

Definición de la 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 activación:

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

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

UPDATE:

La columna IDENTITY ya está disponible en Oracle 12c:

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

o especificar los valores de inicio e incremento, impidiendo también cualquier inserción en la columna de identidad (GENERATED ALWAYS) (de nuevo, sólo en Oracle 12c+)

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

Como alternativa, Oracle 12 también permite utilizar una secuencia como valor por defecto:

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

Aquí hay tres sabores:

  1. numérico. Valor numérico simple y creciente, por ejemplo, 1,2,3,....
  2. GUID. Identificador globalmente univeral, como tipo de datos "RAW".
  3. GUID (cadena). Igual que el anterior, pero como una cadena que puede ser más fácil de manejar en algunos lenguajes.

x es la columna de identidad. Sustituye FOO por el nombre de tu tabla en cada uno de los ejemplos.

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

actualización:

Oracle 12c introduce estas dos variantes que no dependen de triggers:

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

La primera utiliza una secuencia de forma tradicional; la segunda gestiona el valor internamente.

Comentarios (0)

¿Suponiendo que se refiere a una columna como la columna de identidad de SQL Server?

En Oracle, se utiliza una SECUENCIA para lograr la misma funcionalidad. Voy a ver si puedo encontrar un buen enlace y publicarlo aquí.

Actualización: parece que lo has encontrado tú mismo. Aquí está el enlace de todos modos: http://www.techonthenet.com/oracle/sequences.php

Comentarios (0)