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?
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;
/
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));
Zde jsou tři příchutě:
RAW
.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ě.
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