Es scheint, dass es in Oracle bis einschließlich Version 11g kein Konzept für AUTO_INCREMENT gibt.
Wie kann ich eine Spalte erstellen, die sich wie auto increment in Oracle 11g verhält?
Es gibt keine "auto_increment" oder "identity" Spalten in Oracle ab Oracle 11g. Sie können sie jedoch leicht mit einer Sequenz und einem Trigger modellieren:
Tabellendefinition:
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;
Auslöser-Definition:
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END;
/
Die Spalte IDENTITY
ist jetzt in Oracle 12c verfügbar:
create table t1 (
c1 NUMBER GENERATED by default on null as IDENTITY,
c2 VARCHAR2(10)
);
oder geben Sie Start- und Inkrementwerte an, die auch jede Einfügung in die Identitätsspalte verhindern (GENERATED ALWAYS
) (wiederum nur Oracle 12c+)
create table t1 (
c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
c2 VARCHAR2(10)
);
Alternativ dazu erlaubt Oracle 12 auch die Verwendung einer Sequenz als Standardwert:
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));
Hier sind drei Geschmacksrichtungen:
RAW
-Datentyp.x" ist die Identitätsspalte. Ersetzen Sie FOO
mit Ihrem Tabellennamen in jedem der Beispiele.
-- 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;
/
aktualisieren:
Oracle 12c führt diese beiden Varianten ein, die nicht von Triggern abhängen:
create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);
Bei der ersten Variante wird eine Sequenz auf herkömmliche Weise verwendet, bei der zweiten wird der Wert intern verwaltet.
Ich nehme an, Sie meinen eine Spalte wie die SQL Server-Identitätsspalte?
In Oracle verwenden Sie eine SEQUENCE, um die gleiche Funktionalität zu erreichen. Ich werde sehen, ob ich einen guten Link finde und ihn hier posten kann.
Update: Sieht aus, als hätten Sie ihn selbst gefunden. Hier ist jedenfalls der Link: http://www.techonthenet.com/oracle/sequences.php