ID-Vergabe in Datenbanken kompatibel gestalten
2007-06-30 Gespeichert in: Softwareentwicklung
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.
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
Oracle
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):
Damit beide Datenbanksysteme den Wert beim INSERT einheitlich setzen, muss der Standardwert explizit angegeben werden:
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');
