Come creare id con AUTO_INCREMENT su Oracle?

Sembra che non ci sia il concetto di AUTO_INCREMENT in Oracle, fino alla versione 11g compresa.

Come posso creare una colonna che si comporta come l'incremento automatico in Oracle 11g?

Soluzione

Non esiste una cosa come "auto_increment" o "identity" colonne in Oracle a partire da Oracle 11g. Tuttavia, si può modellare facilmente con una sequenza e un trigger:

Definizione della tabella:

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;

Definizione del trigger:

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 colonna IDENTITY è ora disponibile su Oracle 12c:

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

o specificare i valori iniziali e di incremento, impedendo anche qualsiasi inserimento nella colonna identità (GENERATED ALWAYS) (di nuovo, solo Oracle 12c+)

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

In alternativa, Oracle 12 permette anche di usare una sequenza come valore predefinito:

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

Qui ci sono tre gusti:

  1. numerico. Semplice valore numerico crescente, per esempio 1,2,3,....
  2. GUID. Identificatore globale universale, come tipo di dato RAW.
  3. GUID (stringa). Come sopra, ma come una stringa che potrebbe essere più facile da gestire in alcuni linguaggi.

x è la colonna dell'identità. Sostituisci FOO con il nome della tua tabella in ciascuno degli esempi.

-- 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;
/

aggiornamento:

Oracle 12c introduce queste due varianti che non dipendono dai trigger:

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

La prima utilizza una sequenza in modo tradizionale; la seconda gestisce il valore internamente.

Commentari (0)

Supponendo che tu intenda una colonna come quella dell'identità di SQL Server?

In Oracle, si usa una SEQUENZA per ottenere la stessa funzionalità. Vedrò se riesco a trovare un buon link e lo posterò qui.

Aggiornamento: sembra che tu l'abbia trovato da solo. Ecco comunque il link: http://www.techonthenet.com/oracle/sequences.php

Commentari (0)