Miten luoda id AUTO_INCREMENT Oraclessa?

Näyttää siltä, että Oraclessa ei ole AUTO_INCREMENT-käsitettä versioon 11g asti.

Miten voin luoda sarakkeen, joka käyttäytyy kuin automaattinen lisäys Oracle 11g:ssä?

Ratkaisu

Oraclessa Oraclessa 11g ei ole olemassa "automaattista lisäystä" tai "identiteettisarakkeita" sarakkeita. Voit kuitenkin mallintaa sen helposti sekvenssin ja triggerin avulla:

Taulukon määritelmä:

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;

Laukaisimen määritelmä:

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 sarake on nyt saatavilla Oracle 12c:ssä:

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

tai määrittää alku- ja lisäysarvot, jolloin estetään myös kaikki lisäykset identiteettisarakkeeseen (GENERATED ALWAYS) (jälleen vain Oracle 12c+).

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

Vaihtoehtoisesti Oracle 12:ssa voidaan myös käyttää sekvenssiä oletusarvona:

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

Tässä on kolme makua:

  1. numeerinen. Yksinkertaisesti kasvava numeerinen arvo, esim. 1,2,3,.....
  2. GUID. Globally univeral identifier, RAW-tietotyyppinä.
  3. GUID (merkkijono). Sama kuin edellä, mutta merkkijonona, joka saattaa olla helpompi käsitellä joillakin kielillä.

x on identiteettisarake. Korvaa FOO taulukkosi nimellä kussakin esimerkissä.

-- 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 esittelee nämä kaksi vaihtoehtoa, jotka eivät ole riippuvaisia laukaisimista:

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

Ensimmäinen käyttää sekvenssiä perinteisellä tavalla; toinen hallinnoi arvoa sisäisesti.

Kommentit (0)

Tarkoitatko oletettavasti SQL Serverin identiteettisarakkeen kaltaista saraketta?

Oraclessa käytetään SEQUENCE-saraketta saman toiminnallisuuden saavuttamiseksi. Katson, löydänkö hyvän linkin ja lähetän sen tänne.

Päivitys: näyttää siltä, että löysit sen itse. Tässä on kuitenkin linkki: http://www.techonthenet.com/oracle/sequences.php

Kommentit (0)