Jak vytvořit id s AUTO_INCREMENT v systému Oracle?

Zdá se, že ve společnosti Oracle až do verze 11g včetně neexistuje koncept AUTO_INCREMENT.

Jak mohu vytvořit sloupec, který se v Oracle 11g chová jako auto increment?

Řešení

V systému Oracle od verze Oracle 11g neexistuje nic takového jako "auto_increment" nebo "identity" sloupce. Můžete je však snadno modelovat pomocí sekvence a spouštěče:

Definice tabulky:

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;

Definice spouštěče:

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:

Sloupec IDENTITY je nyní k dispozici v systému Oracle 12c:

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

nebo zadat počáteční a přírůstkové hodnoty, což také zabrání jakémukoli vložení do sloupce identity (GENERATED ALWAYS) (opět pouze Oracle 12c+)

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

Oracle 12 také umožňuje alternativně použít sekvenci jako výchozí hodnotu:

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áře (8)

Zde jsou tři příchutě:

  1. číselné. Jednoduchá rostoucí číselná hodnota, např. 1,2,3,.....
  2. GUID. globálně univerzální identifikátor, jako datový typ RAW.
  3. GUID (string). Totéž jako výše, ale jako řetězec, který může být v některých jazycích snadněji zpracovatelný.

x je sloupec identity. V každém z příkladů nahraďte FOO názvem vaší tabulky.

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

update:

Oracle 12c zavádí tyto dvě varianty, které nejsou závislé na spouštěčích:

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

První z nich používá sekvenci tradičním způsobem, druhá spravuje hodnotu interně.

Komentáře (0)

Předpokládám, že máte na mysli sloupec, jako je sloupec identity SQL Serveru?

V systému Oracle se pro dosažení stejné funkce používá SEQUENCE. Podívám se, jestli najdu dobrý odkaz a zveřejním ho zde.

Aktualizace: vypadá to, že jsi ho našel sám. Tady je každopádně odkaz: http://www.techonthenet.com/oracle/sequences.php

Komentáře (0)