Sehr zur Frustration von Datenbankadministratoren weltweit hatte Oracle vor Oracle Version 12c Mitte 2014 einfach keine inhärente Fähigkeit, automatisch inkrementierende Spalten innerhalb eines Tabellenschemas zu generieren. Während die Gründe für diese Designentscheidung nur vermutet werden können, ist die gute Nachricht, dass es sogar für Benutzer auf älteren Oracle-Systemen eine mögliche Problemumgehung gibt, um diese Falle zu umgehen und Ihre eigene automatisch inkrementierte Primärschlüsselspalte zu erstellen.
Erstellen einer Sequenz
Der erste Schritt besteht darin, eine SEQUENCE
zu erstellen in Ihrer Datenbank, die ein Datenobjekt ist, auf das mehrere Benutzer zugreifen können, um automatisch inkrementierte Werte zu generieren. Wie in der Dokumentation besprochen, verhindert eine Sequenz in Oracle, dass doppelte Werte gleichzeitig erstellt werden, da mehrere Benutzer gezwungen sind, sich „abwechseln“ zu müssen, bevor jedes sequenzielle Element generiert wird.
Um einen eindeutigen Primärschlüssel für eine neue Tabelle zu erstellen, müssen wir zuerst CREATE
die Tabelle, die wir verwenden werden:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
Als nächstes müssen wir einen PRIMARY KEY
hinzufügen Einschränkung:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Schließlich erstellen wir unsere SEQUENCE
die später verwendet wird, um den eindeutigen, automatisch inkrementierten Wert zu generieren.
CREATE SEQUENCE books_sequence;
Trigger hinzufügen
Während wir unsere Tabelle erstellt haben und einsatzbereit sind, steht unsere Sequenz bisher nur da, wird aber nie verwendet. Hier wird TRIGGERS
komm rein.
Ähnlich einem event
in modernen Programmiersprachen ein TRIGGERS
in Oracle ist eine gespeicherte Prozedur, die ausgeführt wird, wenn ein bestimmtes Ereignis eintritt.
Typischerweise ein TRIGGERS
wird so konfiguriert, dass es ausgelöst wird, wenn eine Tabelle aktualisiert oder ein Datensatz gelöscht wird, was bei Bedarf ein wenig Aufräumarbeiten bereitstellt.
In unserem Fall wollen wir unseren TRIGGERS
ausführen vor INSERT
in unsere books
Tabelle, um unsere SEQUENCE
sicherzustellen wird inkrementiert und dieser neue Wert wird an unsere Primärschlüsselspalte weitergegeben.
CREATE OR REPLACE TRIGGER books_on_insert
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT books_sequence.nextval
INTO :new.id
FROM dual;
END;
Hier erstellen wir (oder ersetzen, falls vorhanden) den TRIGGERS
namens books_on_insert
und angeben, dass der Trigger BEFORE INSERT
auslösen soll tritt für die books
auf Tabelle und auf alle darin enthaltenen Zeilen anwendbar sein.
Der „Code“ des Triggers selbst ist ziemlich einfach:Wir SELECT
der nächste inkrementelle Wert aus unserer zuvor erstellten books_sequence
SEQUENCE
, und diese in :new
einfügen Aufzeichnung der books
Tabelle in der angegebenen .id
Feld.
Hinweis:Der FROM dual
Teil ist notwendig, um eine ordnungsgemäße Abfrage zu vervollständigen, ist aber praktisch irrelevant. Das dual
table ist nur eine einzelne Dummy-Datenzeile und wird in diesem Fall hinzugefügt, damit sie ignoriert werden kann und wir stattdessen die Systemfunktion unseres Triggers ausführen können, anstatt Daten irgendeiner Art zurückzugeben.
IDENTITÄTSspalten
IDENTITY
-Spalten wurden in Oracle 12c eingeführt, was eine einfache Autoinkrement-Funktionalität in modernen Versionen von Oracle ermöglicht.
Verwendung der IDENTITY
column ist funktional ähnlich wie bei anderen Datenbanksystemen. Unsere obigen books
neu erstellen Tabellenschema im modernen Oracle 12c oder höher verwenden wir einfach die folgende Spaltendefinition.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);