Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So definieren Sie einen Auto-Increment-Primärschlüssel in Oracle

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