Comment créer un identifiant avec AUTO_INCREMENT sur Oracle ?

Il semble qu'il n'existe pas de concept d'AUTO_INCREMENT dans Oracle, jusqu'à la version 11g incluse.

Comment puis-je créer une colonne qui se comporte comme un auto-incrément dans Oracle 11g ?

Solution

Les colonnes "auto_increment" ou "identité" n'existent pas dans Oracle à partir d'Oracle 11g. Cependant, vous pouvez le modéliser facilement avec une séquence et un déclencheur :

Définition de la table :

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;

Définition du déclencheur :

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 colonne [IDENTITY][1] est maintenant disponible sur Oracle 12c :

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

ou spécifier des valeurs de départ et d'incrémentation, empêchant également toute insertion dans la colonne identité (GENERATED ALWAYS) (encore une fois, Oracle 12c+ uniquement)

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

Alternativement, Oracle 12 permet également d'utiliser une séquence comme valeur par défaut :

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

[1] : http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA109

Commentaires (8)

Voici trois saveurs :

  1. numérique. Valeur numérique croissante simple, par exemple 1,2,3,.....
  2. GUID. Identifiant universel mondial, sous forme de type de données RAW.
  3. GUID (chaîne de caractères). Identique au précédent, mais sous forme de chaîne, ce qui peut être plus facile à gérer dans certains langages.

x est la colonne d'identité. Remplacez FOO par le nom de votre table dans chacun des exemples.

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

mettre à jour :

Oracle 12c introduit ces deux variantes qui ne dépendent pas des triggers :

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

La première utilise une séquence de manière traditionnelle ; la seconde gère la valeur en interne.

Commentaires (0)

En supposant que vous voulez dire une colonne comme la colonne d'identité du serveur SQL ?

Dans Oracle, vous utilisez une SEQUENCE pour obtenir la même fonctionnalité. Je vais voir si je peux trouver un bon lien et le poster ici.

Mise à jour : il semble que vous l'ayez trouvé vous-même. Voici quand même le lien : http://www.techonthenet.com/oracle/sequences.php

Commentaires (0)