Hvordan oprettes id med AUTO_INCREMENT i Oracle?

Det ser ud til, at der ikke findes noget koncept for AUTO_INCREMENT i Oracle, indtil og med version 11g.

Hvordan kan jeg oprette en kolonne, der opfører sig som auto increment i Oracle 11g?

Løsning

Der findes ikke noget som "auto_increment" eller "identitet" kolonner i Oracle fra Oracle 11g. Du kan dog nemt modellere det med en sekvens og en trigger:

Tabeldefinition:

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;

Definition af udløser:

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

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

OPDATE:

IDENTITY kolonnen er nu tilgængelig på Oracle 12c:

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

eller angiv start- og inkrementeringsværdier, hvilket også forhindrer enhver indsættelse i identitetskolonnen (GENERATED ALWAYS) (igen, kun Oracle 12c+)

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

Alternativt giver Oracle 12 også mulighed for at bruge en sekvens som standardværdi:

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

Her er tre smagsvarianter:

  1. numerisk. Simpel stigende numerisk værdi, f.eks. 1,2,3,....
  2. GUID. Globalt universel identifikator, som en RAW datatype.
  3. GUID (string). Samme som ovenfor, men som en streng, hvilket kan være lettere at håndtere i nogle sprog.

x er identitetskolonnen. Erstat FOO med dit tabelnavn i hvert af eksemplerne.

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

opdatering:

Oracle 12c introducerer disse to varianter, der ikke er afhængige af triggere:

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

Den første bruger en sekvens på den traditionelle måde; den anden håndterer værdien internt.

Kommentarer (0)

Jeg går ud fra, at du mener en kolonne som SQL Server identity-kolonnen?

I Oracle bruger du en SEQUENCE for at opnå den samme funktionalitet. I'll se om jeg kan finde et godt link og sende det her.

Opdatering: ser ud til at du selv har fundet det. Her er linket alligevel: http://www.techonthenet.com/oracle/sequences.php

Kommentarer (0)