Hvordan opprette id med AUTO_INCREMENT på Oracle?

Det ser ut til at det ikke finnes noe konsept for AUTO_INCREMENT i Oracle, til og med versjon 11g.

Hvordan kan jeg opprette en kolonne som oppfører seg som automatisk inkrement i Oracle 11g?

Løsning

Det er ikke noe som heter "auto_increment" eller "identitet" kolonner i Oracle fra og med Oracle 11g. Du kan imidlertid enkelt modellere det med en sekvens og en utløser:

Tabelldefinisjon:

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;

Definisjon av utlø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;
/

UPDATE:

Kolonnen IDENTITET er nå tilgjengelig på Oracle 12c:

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

eller angi start- og inkrementverdier, noe som også forhindrer innsetting i identitetskolonnen (GENERATED ALWAYS) (igjen, kun Oracle 12c+).

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

Alternativt tillater Oracle 12 også å bruke en sekvens som standardverdi:

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 smaker:

  1. numerisk. Enkel økende numerisk verdi, f.eks. 1,2,3,....
  2. GUID. global universell identifikator, som en RAW datatype.
  3. GUID (streng). Samme som ovenfor, men som en streng som kan være enklere å håndtere på enkelte språk.

xer identitetskolonnen. ErstattFOO` med ditt tabellnavn i hvert av eksemplene.

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

oppdatering:

Oracle 12c introduserer disse to variantene som ikke er avhengig av utløsere:

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

Den første bruker en sekvens på den tradisjonelle måten; den andre administrerer verdien internt.

Kommentarer (0)

Forutsatt at du mener en kolonne som SQL Server-identitetskolonnen?

I Oracle bruker du en SEQUENCE for å oppnå samme funksjonalitet. Jeg skal se om jeg kan finne en god lenke og legge den ut her.

Oppdatering: ser ut til at du fant det selv. Her er lenken uansett: http://www.techonthenet.com/oracle/sequences.php

Kommentarer (0)