Michael Schröpl: Automatisches Aufnummerieren in einer Abfrage

Beitrag lesen

Wie kann in SQL ich mittels eines Update-Statements der Wert eines Feldes in der Abrage aufnummerieren, beginnend mit einem vorgegebenen Startwert.

Reden wir von SQL, oder von einer abgemagerten real existierenden Implementierung?

Wichtig ist, dass dieses Aufnummerierung in einer Transaktion erfolgt, damit bei einem Fehlschlag ein vollständiger Rollback vorgenommen werden kann.
Aus diesem Grund scheitert auch das Abarbeiten der Abfrage in einer Schleife, da dort bei einem Fehler nur die Änderung am letzten Datensatz zurückgenommen werden kann, jedoch nicht die komplette Aufnummerierung der Rechnungsnummern.

Die Logik dieser Aussage erschließt sich mir nicht:

  • Transaktion öffnen
  • Schleife ausführen
  • COMMIT oder ROLLBACK, je nach Wunsch.

Aber ich würde es in der Tat anders lösen.
In meiner Oracle-Datenbank funktioniert folgendes:

CREATE SEQUENCE seq
       INCREMENT BY 1
       START BY <startwert>
       ORDER;

Für Startwert einmalig "max(rechnr)+1"
aus Deiner Tabelle einsetzen.

Nun kannst Du sagen:

UPDATE tblBestellungen
       SET rechnr = seq.nextval
       WHERE rechnr IS NULL;

und bekommst lauter verschiedene Sequenznummern.
Diese sind auch dann verbraucht, wenn Du die Transaktion
mit ROLLBACK abbrichst; man kann den Generator aber
durch ALTER SEQUENCE auch manuell zurücksetzen.

Eleganter fände ich allerdings die Methode, erst gar
keine undefinierten Rechnungsnummern zuzulassen.
Was hindert Dich eigentlich daran, schon beim Eintragen
des Datensatzes abzufragen, ob eine Rechnungsnummer
vorliegt, und dann sofort eine zu generieren?
(Ebenfalls durch Zugriff auf einen solchen Generator.)

Am wenigsten Fehler kann der DAU immer noch bei einem
Vorgang machen, der gar nicht existiert ...