Ako vytvoriť id s AUTO_INCREMENT v systéme Oracle?

Zdá sa, že v systéme Oracle až do verzie 11g vrátane neexistuje koncept AUTO_INCREMENT.

Ako môžem vytvoriť stĺpec, ktorý sa v Oracle 11g správa ako auto increment?

Riešenie

V systéme Oracle od verzie Oracle 11g neexistuje nič také ako "auto_increment" alebo "identity" stĺpce. Môžete ho však ľahko modelovať pomocou sekvencie a spúšťača:

Definícia tabuľky:

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;

Definícia spúšťača:

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:

IDENTITY stĺpec je teraz dostupný v Oracle 12c:

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

alebo špecifikovať počiatočné hodnoty a hodnoty prírastku, čo tiež zabráni akémukoľvek vloženiu do stĺpca identity (GENERATED ALWAYS) (opäť len Oracle 12c+)

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

Prípadne Oracle 12 umožňuje použiť ako predvolenú hodnotu aj sekvenciu:

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));
Komentáre (8)

Tu sú tri príchute:

  1. číselné. Jednoduchá rastúca číselná hodnota, napr. 1,2,3,....
  2. GUID. globálne univerzálny identifikátor ako dátový typ RAW.
  3. GUID (reťazec). To isté ako vyššie, ale ako reťazec, s ktorým sa môže v niektorých jazykoch ľahšie pracovať.

x je stĺpec identity. V každom z príkladov nahraďte FOO názvom vašej tabuľky.

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

aktualizovať:

Oracle 12c zavádza tieto dva varianty, ktoré nie sú závislé na spúšťačoch:

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

Prvý z nich používa sekvenciu tradičným spôsobom; druhý spravuje hodnotu interne.

Komentáre (0)

Predpokladáme, že máte na mysli stĺpec, ako je stĺpec identity servera SQL Server?

V Oracle sa na dosiahnutie rovnakej funkcie používa SEQUENCE. Uvidím, či nájdem dobrý odkaz a uverejním ho tu.

Aktualizácia: vyzerá to tak, že ste ho našli sami. Tu je odkaz v každom prípade: http://www.techonthenet.com/oracle/sequences.php

Komentáre (0)