ID-Vergabe in Datenbanken kompatibel gestalten

In vielen Fällen werden Datenbanktabellen angelegt, wo eine numerische ID-Spalte von der Datenbank automatisch auf einen eindeutigen Wert gesetzt werden soll. Leider ist dies mit Standard-SQL nicht einheitlich zu lösen, da die INSERT-Anweisungen danach nicht identisch sind.

Problem:


Die automatische Vergabe von eindeutigen Werten für eine Spalte ist leider in SQL nicht standardisiert. Daraus folgen nicht nur unterschiedliche CREATE TABLE Anweisungen, sondern auch die INSERT-Anweisungen sehen unterschiedlich aus.

MySQL

CREATE TABLE test ( id INTEGER NOT NULL AUTO_INCREMENT, value VARCHAR(200), PRIMARY KEY(id));INSERT INTO test (value) VALUES ('Hallo');

Oracle

CREATE TABLE test ( id INTEGER NOT NULL, value VARCHAR(200), PRIMARY KEY(id));CREATE SEQUENCE test_seq;INSERT INTO test (id, value) VALUES (test_seq.NEXTVAL, 'Hallo');

Lösung:


Diese INSERT-Anweisungen können nun durch einen kleinen Trick vereinheitlicht werden. Dazu wird Oracle über einen Trigger angewiesen, die ID-Spalte beim Insert selbst zu setzen (mit SQLPlus ausführen):

CREATE OR REPLACE TRIGGER test_autoincrementBEFORE INSERT ON test FOR EACH ROWBEGIN IF :new.id IS NULL THEN SELECT test_seq.NEXTVAL INTO :new.id FROM dual; END IF;END;/

Damit beide Datenbanksysteme den Wert beim INSERT einheitlich setzen, muss der Standardwert explizit angegeben werden:

INSERT INTO test (id, value) VALUES (DEFAULT, 'Hallo');