Kā Oracle sistēmā izveidot id ar AUTO_INCREMENT?

Šķiet, ka Oracle sistēmā līdz 11g versijai ieskaitot nav AUTO_INCREMENT jēdziena.

Kā es varu izveidot kolonnu, kas Oracle 11g darbojas kā automātiskā inkrementācija?

Risinājums

Oracle sistēmā no Oracle 11g nepastāv kolonnas, piemēram, "auto_increment" vai "identitātes". Tomēr to var viegli modelēt, izmantojot secību un sprūdu:

Tabulas definīcija:

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;

Sprūda definīcija:

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

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

ATJAUNINĀJUMS:

IDENTITY sleja tagad ir pieejama Oracle 12c:

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

vai norādīt sākuma un pieauguma vērtības, arī novēršot jebkuru iestarpinājumu identitātes slejā (GENERATED ALWAYS) (atkal tikai Oracle 12c+).

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

Oracle 12 ļauj arī izmantot secību kā noklusējuma vērtību:

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āri (8)

Šeit ir trīs garšas:

  1. skaitlis. Vienkārša pieaugoša skaitliskā vērtība, piemēram, 1,2,3,.....
  2. GUID. globāli universāls identifikators kā RAW datu tips.
  3. GUID (virkne). Tas pats, kas iepriekš, bet kā virkne, ko dažās valodās varētu būt vieglāk apstrādāt.

x ir identitātes sleja. Katrā piemērā aizstāt FOO ar savas tabulas nosaukumu.

-- 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 ievieš šos divus variantus, kas nav atkarīgi no trigeriem:

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

Pirmais izmanto secību tradicionālā veidā, otrais pārvalda vērtību iekšēji.

Komentāri (0)

Pieļauju, ka jūs domājat tādu kolonnu kā SQL Server identitātes kolonna?

Oracle programmā, lai sasniegtu to pašu funkcionalitāti, tiek izmantota SEQUENCE. Es paskatīšos, vai varu atrast labu saiti un ievietot to šeit.

Atjauninājums: izskatās, ka jūs pats to atradāt. Tomēr šeit ir saite: : http://www.techonthenet.com/oracle/sequences.php

Komentāri (0)