DDL-Beispiel einer Relation mit Identity-Spalte :
CREATE TABLE USERNAME (
ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ),
nameUSER VARCHAR(20),
pwd VARCHAR(20),
email VARCHAR(30),
MONEY DECIMAL(10,2),
PositionUSER BigInt
);
ALTER TABLE USERNAME ADD CONSTRAINT "PKEY_USER" PRIMARY KEY ("ID");
CREATE UNIQUE INDEX "index_User_Name" ON USERNAME (nameUSER);
Zugriffbeispiel (ok ist in ibatis sqlmaps, kann aber leicht auf andere RDBMS-Frameworks transferiert werden:
INSERT INTO
UserName (nameUser, pwd, email, money, positionUser) Values
(#nameUser#, #pwd#,#email#, #money#, #position#)
Wichtig ist die Spaltennamen explizit zu benennen. Die Identity column (hier: ID) hier nicht setzen. Das wird automatisch von DB2 erledigt.
Oft braucht man im Skript die von DB2 generierte ID unmittelbar nach dem insert. Falls es neben der ID Spalte einen eindeutigen "natürlichen " key (im Beispiel nameUser) gibt, kann man ein Select versuchen.
Das ist nicht besonders performant.
DB2 kennt ausserdem die proprietäre Funktion Values(identity_val_local()), womit man die zuletzt eingefügte ID bekommt. Noch nicht zu Ende gedacht, aber diese Funktion unterliegt möglicherweise concurrency Problemen (gleichzeitiges einfügen von Datnesätzen). In dem Framework, mit dem ich z.Zt. mit DB2 arbeite (ibatis sqlmaps), scheinen automatisch irgendwelche Transaktionen gesetzt zu werden, die das möglicherweise absichern. Werd mir das nochmal genauer anschauen.
Ein Identity oder autoIncrement sowie eine Funktion, um den letzten Wert zu ermitteln, gibt es in praktischen allen Rdbms (inklusive open source wie mySql und Hypersonic). Nur ist das nicht nicht standardisiert und läuft überall ein bischen anders.
Wenn du eine email an axel dot janssen at gmail dot com schickst, kann ich dir ein paar sinnvolle redbooks schicken (zu db2 vs.7, aber ich arbeite auch mit 8 mit denen).
Z.B. braucht man imho eine Übersicht der errorcodes und -states bei solchen Meldungen:
ause: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;DB2ADMIN.USERNAME