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 ?
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;
/
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
Voici trois saveurs :
RAW
.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.
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