## Nummerngeneratoren für Tabellen

Mit Hilfe der CREATE SEQUENCE-Anweisung können Sie eine Sequenz und dadurch einen impliziten Nummerngenerator (automatisch generierte Abfolge von Zahlen) erzeugen.

Eine typische Anwendung ist die Erzeugung eines Primärschlüssels.

Bei jedem Zugriff auf eine Sequenz können Sie den nächsten verfügbaren Wert des Nummerngenerators ermitteln und weiterverwenden. Die Werte des Nummerngenerators können aus den Pseudospalten NEXTVAL und CURRVAL abgerufen werden. Diese Werte sind immer ganze Zahlen.

● NEXTVAL gibt den nächsten verfügbaren Wert an, der durch den Nummergenerator erzeugt wurde

● CURRVAL gibt den gerade verwendeten Wert an, der innerhalb der Datenbanksitzung durch den Nummerngenerator erzeugt wurde.

In INSERT- und UPDATE-Anweisungen können der nächste verfügbare und der gerade verwendete Sequenzwert in einer beliebigen Spalte einer Tabelle angegeben werden, wenn das der Datentyp dieser Spalte erlaubt. Jedoch ist es nicht möglich, den nächsten verfügbaren und den gerade verwendeten Wert als DEFAULT-Wert einer Spalte zu definieren. Beide Werte müssen immer explizit angegeben werden.

### Voraussetzungen

Sie benötigen die Demo-Daten für das SQL-Tutorial.

Starten Sie das Query Tool SQL Studio als Datenbankadministrator MONA mit dem Kennwort RED und melden Sie sich an die Demo-Datenbankinstanz DEMODB an.

### Anlegen einer Sequenz

...

...

Legen Sie die Sequenz sequ mit Hilfe der CREATE SEQUENCE-Anweisung an.

Geben Sie den Sequenznamen und den ersten Sequenzwert an (START WITH <integer>, Vorschlagswert ist 1). Geben Sie an, wie der nächste Wert in der Sequenz erzeugt werden soll (INCREMENT BY <integer>, Vorschlagswert ist 1)

CREATE SEQUENCE hotel.sequ
START WITH 1
INCREMENT BY 1

Siehe auch:

SQL-Referenzhandbuch, CREATE SEQUENCE-Anweisung (create_sequence_statement)

### Verwenden einer Sequenz

Legen Sie für die folgenden Beispiele die Tabellen pers1 und pers2 an.

CREATE TABLE hotel.pers1
(pno FIXED(6),
firstname CHAR(20),
name CHAR(20))
//
CREATE TABLE hotel.pers2
(pno FIXED(6),
firstname CHAR(20),
name CHAR(20))

#### Ein Nummerngenerator für verschiedenen Tabellen

Sie können den durch die Sequenz sequ erzeugten Nummerngenerator in Ihren SQL-Anweisungen verwenden. Geben Sie dazu nach dem Sequenznamen das Schlüsselwort NEXTVAL an.

Wenn Sie den Nummerngenerator in verschiedenen Tabellen verwenden wollen, geben Sie diesen in der Form <sequence_name>.NEXTVAL in den gewünschten Tabellen an.

INSERT INTO hotel.pers1 VALUES (hotel.sequ.NEXTVAL,'Mary','Jackson')

//

INSERT INTO hotel.pers2 VALUES (hotel.sequ.NEXTVAL,'Billy','Jackson')

//

INSERT INTO hotel.pers1 VALUES (hotel.sequ.NEXTVAL,'Lucy','Baker')

//

INSERT INTO hotel.pers2 VALUES (hotel.sequ.NEXTVAL,'Henry','Baker')

//

INSERT INTO hotel.pers1 VALUES (hotel.sequ.NEXTVAL,'Anna','Miller')

//

INSERT INTO hotel.pers2 VALUES (hotel.sequ.NEXTVAL,'Mike','Miller')

//

INSERT INTO hotel.pers1 VALUES (hotel.sequ.NEXTVAL,'Peggy','Miller')

//

SELECT * FROM hotel.pers1

Ergebnis

PNO | FIRSTNAME | NAME
1 | Mary | Jackson
3 | Lucy | Baker
5 | Anna | Miller
7 | Peggy | Miller

SELECT * FROM hotel.pers2

Ergebnis

PNO | FIRSTNAME | NAME
2 | Billy | Jackson
4 | Henry | Baker
6 | Mike | Miller

#### Anzeige des gerade verwendeten Wertes des Nummerngenerators

Zur Anzeige des gerade verwendeten Wertes des Nummerngenerator können Sie die automatisch durch das Datenbanksystem erzeugte Tabelle DUAL verwenden. Die Tabelle DUAL kann durch alle Datenbankbenutzer verwendet werden. Da die Tabelle DUAL nur eine Zeile hat, können Sie diese Tabelle dazu verwenden, den Wert des Nummerngenerators mit Hilfe einer SELECT-Anweisung anzeigen zu lassen.

SELECT hotel.sequ.CURRVAL FROM dual

Ergebnis

| EXPRESSION1
1 | 7

Wenn <sequence_name>.NEXTVAL innerhalb der aktuellen Datenbanksitzung noch nicht verwendet wurde, ist die Verwendung von <sequence_name>.CURRVAL nicht möglich.

Siehe auch:

SQL-Referenzhandbuch, Spezifikation von Werten (extended_value_spec)

#### Wert eines Nummerngenerators mehrmals verwenden

Sie haben unter anderem folgende Möglichkeit, wenn Sie einen Wert des Nummerngenerators mehrmals verwenden wollen:

Geben Sie den gerade verwendeten Wert des Nummerngenerators <sequence_name>.CURRVAL in Ihrer SQL-Anweisung an.

INSERT INTO hotel.pers1 VALUES (hotel.sequ.NEXTVAL,'Mary','Ford')

//

INSERT INTO hotel.pers2 VALUES (hotel.sequ.CURRVAL,'Mary','Ford')

//

SELECT * FROM hotel.pers1

Ergebnis

PNO | FIRSTNAME | NAME
1 | Mary | Jackson
3 | Lucy | Baker
5 | Anna | Miller
7 | Peggy | Miller
8 | Mary | Ford

SELECT * FROM hotel.pers2

Ergebnis

PNO | FIRSTNAME | NAME
2 | Billy | Jackson
4 | Henry | Baker
6 | Mike | Miller
8 | Mary | Ford

Siehe auch:

Nummerngenerator für eine einzelne Spalte einer Tabelle

### Löschen des Nummerngenerators

Zum Löschen des Nummerngenerators müssen Sie die Sequenz mit Hilfe der DROP SEQUENCE-Anweisung löschen.

DROP SEQUENCE hotel.sequ

Siehe auch:

SQL-Referenzhandbuch, DROP SEQUENCE-Anweisung (drop_sequence_statement)

Weitere Beispiele zur Datendefinition