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
);