Lange haben wir darauf gewartet, endlich ist sie da! Oracle 12c! Das "c" steht für Cloud.
Wir wollen in dieser Reihe einige neue Features vorstellen, die wir natürlich auch in unserem Oracle 12c Kurs ausführlich besprechen.
Oracle 12c: Identity Spalten
Der SQL Server kann es schon seit einiger Zeit, Oracle nun auch ab Version 12c.
Eine Primärschlüsselspalte kann automatisch mit einem Wert gefüllt werden. Einfachster Fall, Sequenz soll bei 1 starten, Schrittweite 1:
CREATE TABLE t (
id NUMBER GENERATED AS IDENTITY PRIMARY KEY,
text VARCHAR2(10));
INSERT INTO t (text) VALUES ('X');
SELECT * from t;
ID TEXT
-- ----------
1 X
Oder etwas aufwendiger mit Startwert 100 und Schrittweite 10 (aber ohne Primärschlüssel):
CREATE TABLE t (
id NUMBER GENERATED BY DEFAULT AS IDENTITY
(START WITH 100 INCREMENT BY 10),
text VARCHAR2(10));
Möchten Sie eine bestehende Identity löschen ?
ALTER TABLE t MODIFY
(id DROP IDENTITY);
Auch ein nachträgliches Setzen der Identity ist möglich, mit neuer Spalte:
ALTER TABLE T ADD (ID_NEU NUMBER GENERATED AS IDENTITY
(START WITH 100));
Wenn ein bestehender Sequenzwert um 100 erhöht werden soll, kann man die Identity auf der Spalte löschen und einfach neu setzen.
Sie können pro Tabelle nur eine Identity Spalte festlegen. Wird die Identity Klausel verwendet, dann muss der Datentyp in der Spaltendefinition numerisch sein. Ein benutzerdefinierter Datentyp kann nicht spezifiziert werden.
Sie müssen nicht zwingend eine Primärschlüsselspalte für die Identity verwenden.
Das Setzen eines Defaultwertes in der Spaltendefinition ist bei der Verwendung der Identity Klausel nicht erlaubt. Wird die Identity Klausel verwendet, so wird automatisch ein NOT NULL Constraint auf die Spalte gesetzt.
Wie funktionierts ?
Oracle legt eine Sequenz im Schema der Tabelle an (z. B. mit Namen ISEQ$$_12345 und als Default mit Cache=20). Einen Insert-Trigger haben wir jedoch nicht entdeckt.
Sie können feststellen, welche Tabelle Identity Spalten verwendet:
SELECT owner, table_name, has_identity
FROM all_tables
WHERE table_name='T';
OWNER TABLE_ HAS_IDENTITY
------ ------ ------------
SCOTT T YES
Oder wenn Sie wissen wollen, welche Spalte vom Typ Identity ist:
SELECT owner,table_name, column_name, identity_column
FROM all_tab_columns
WHERE table_name='T';
Ausführliche Optionssyntax:
…( START WITH ( <int> | LIMIT VALUE ) | INCREMENT BY <int>|
( MAXVALUE integer | NOMAXVALUE ) |
( MINVALUE integer | NOMINVALUE ) |
( CYCLE | NOCYCLE ) |
( CACHE integer | NOCACHE ) |
( ORDER | NOORDER ) }
Komplexes Beispiel:
CREATE TABLE T (ID NUMBER
GENERATED AS IDENTITY (START WITH 1000 INCREMENT
BY 10 MAXVALUE 10000 CYCLE CACHE 1000 ORDER),
text VARCHAR2(10));
>100 weitere neue Funktionen der Oracle 12c Version lernen Sie in unserem Oracle 12c Neuerungen Kurs kennen.