Eine SEQUENCE ist ein eigenständiges Datenbankobjekt, das aufsteigende (oder absteigende) Zahlenfolgen erzeugt. Anders als AUTO_INCREMENT und IDENTITY ist sie nicht an eine Tabelle gebunden und kann mehrere Tabellen gleichzeitig mit Nummern versorgen.

Eine SEQUENCE anlegen

Mit CREATE SEQUENCE legen PostgreSQL, Oracle und MariaDB (seit 10.3) eine eigene Zahlenfolge an:

CREATE SEQUENCE kunden_id_seq
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    NO CYCLE;

START WITH setzt den ersten Wert, INCREMENT BY die Schrittweite. CYCLE lässt die Folge am Maximum wieder von vorne beginnen, NO CYCLE meldet stattdessen einen Fehler. Mit CACHE 20 hält die Datenbank einen Puffer vor und spart damit Schreibzugriffe.

Werte abrufen

In PostgreSQL holt nextval('kunden_id_seq') den nächsten Wert, currval zeigt den zuletzt geholten Wert der Session. Oracle schreibt kunden_id_seq.NEXTVAL und kunden_id_seq.CURRVAL. Als Datentyp eignet sich eine Ganzzahl, typischerweise für den Primärschlüssel:

INSERT INTO kunden (id, name)
VALUES (nextval('kunden_id_seq'), 'Anna');

Praktisch ist die direkte Zuweisung als Standardwert, damit das INSERT die Spalte gar nicht erst nennen muss.

Eine Folge für viele Tabellen

Der große Vorteil gegenüber AUTO_INCREMENT und IDENTITY: Dieselbe SEQUENCE kann Nummern für mehrere Tabellen liefern, etwa für global eindeutige Belegnummern. Dabei ist zu bedenken, dass nextval einen Wert auch dann verbraucht, wenn die umgebende Transaktion später zurückgerollt wird – Lücken sind also auch hier ganz normal.

Abgrenzung

MySQL kennt bis heute keine SEQUENCE-Objekte und nutzt AUTO_INCREMENT. SQL Server und PostgreSQL bieten zusätzlich die tabellengebundene IDENTITY-Spalte an, die intern bei PostgreSQL auf einer Sequenz aufbaut.

Verwandte Grundlagen: CREATE TABLE, SQL-Grundlagen, Transaktionen, MariaDB.