2010-12-28 18 views
0

Nachdem ich letzte Woche eine Antwort auf ein Java-Problem bekommen hatte (danke!), Bin ich jetzt auf ein neues Problem mit DB2 gestoßen ... Die Java-App, an der ich arbeite, entnimmt Daten ein Webformular und fügt es in eine DB2-Datei (Datenbank) ein. Die SQL-Zeichenfolge, die mit dem Java PreparedStatement-Objekt übergeben wird, ist:DB2 eindeutiger Index und automatische Nummerierung

insert into EVCRPTFL (
     AUID, URLEX, URNEX, URNAME, URRCPT, URRUN, URRECT, URRECS, URRDYS, URRWKS, URRMHS, URRMTH, URRDAY, URRTHE, URRWHT, URRWDY, UREXPT, UROCRM, UROCRN, UREXPR, URSTTS, URACTV, URRPT, URD1YR, URD1YN, URD1MR, URD1MN, URD1DR, URD1DN, URD2YR, URD2YN, URD2MR, URD2MN, URD2DR, URD2DN, URRPAR, URLANG, URCTRY 
    ) 
    values (
     ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? 
    ) 

Hier ist die Tabellenerstellung Skript:

CREATE TABLE EVCRPTFL (
    URID int NOT NULL, 
    AUID decimal(11,0) NOT NULL, 
    URLEX timestamp, 
    URNEX timestamp, 
    URNAME varchar(40) NOT NULL, 
    URRCPT varchar(500) NOT NULL, 
    URRUN timestamp, 
    URRECT char(1) NOT NULL, 
    URRECS int NOT NULL, 
    URRDYS int NOT NULL, 
    URRWKS int NOT NULL, 
    URRMHS int NOT NULL, 
    URRMTH int NOT NULL, 
    URRDAY int NOT NULL, 
    URRTHE int NOT NULL, 
    URRWHT int NOT NULL, 
    URRWDY int NOT NULL, 
    UREXPT int NOT NULL, 
    UROCRM int NOT NULL, 
    UROCRN int NOT NULL, 
    UREXPR timestamp, 
    URSTTS char(1) NOT NULL, 
    URACTV timestamp, 
    URRPT int NOT NULL, 
    URD1YR int, 
    URD1YN int, 
    URD1MR int, 
    URD1MN int, 
    URD1DR int, 
    URD1DN int, 
    URD2YR int, 
    URD2YN int, 
    URD2MR int, 
    URD2MN int, 
    URD2DR int, 
    URD2DN int, 
    URRPAR varchar(1000), 
    URLANG char(2), 
    URCTRY char(2) 
); 

CREATE UNIQUE INDEX EVCRPTFL ON EVCRPTFL(URID); 

Wie Sie sehen können, ist es in allen Werten in der SQL-Zeichenfolge außer der Weitergabe Erster, URID. Nachdem ein Datensatz eingefügt wurde, kann ich ihn in der Datenbank mit einer ID-Nummer sehen, was bedeutet, dass die Datenbank die URID automatisch hinzufügt (dh die ID wird nicht im Java-Code generiert und dann an die Datenbank weitergegeben). In meinen früheren Erfahrungen mit Oracle und PHP habe ich Oracle-Sequenzen verwendet, um Felder mit Auto-Nummerierung zu erstellen, und mir ist klar, dass es in MySQL, Postgres und wahrscheinlich anderen Datenbanksystemen weitgehend ähnliche Funktionen gibt, aber ich konnte es nicht finden Automatische Nummerierung funktioniert in DB2.

Mein Mitarbeiter, der mit DB2 vertrauter ist, ist ebenfalls verwirrt; er sagt, dass keine Trigger auf dem Tisch eingerichtet sind, je nachdem, was er angeschaut hat, und dass es im RPG-Code klingt, dass ID-Nummern im Code generiert und dann an die Datenbank weitergegeben werden, anstatt von der Datenbank generiert zu werden selbst.

Also meine Frage ist: Erzeugt der eindeutige Index auf URID auch ID-Nummern, oder gibt es etwas anderes, das ich entweder in der Datenbank oder im Java-Code suchen muss?

Und meine folgende Frage ist: Ich werde schließlich die URID-Nummer für die Einfügung in eine andere Tabelle verwenden müssen, die zugehörige Daten speichert. In Oracle wurde dies mit "into into return in" durchgeführt und dann wurden die Daten aus der parametrisierten id_variable im Code entfernt. Gibt es eine ähnliche Funktion in DB2? Ich habe Dokumentation zu einer IDENTITY_VAL_LOCAL-Funktion gefunden, aber es sieht nicht so aus, als könnte ich immer garantieren, dass sie die richtige ID zurückgibt, zum Beispiel wenn eine andere Einfügung aus dem Webformular zwischen der ersten Einfügung und dem Aufruf von IDENTITY_VAL_LOCAL ...

erfolgt

Ich kann Codebeispiele oder andere Datenbankinformationen bei Bedarf bereitstellen. Vielen Dank!

+0

Ich denke, Sie werden feststellen, dass IDENTITY_VAL_LOCAL auf die Verbindung beschränkt ist ... – kem

+0

@ kem: Ich bin froh zu sagen, dass ich eine Java-Methode gefunden, die die letzte ID zurückgibt (prepareStatement (sql, Statement.RETURN_GENERATED_KEYS)) Ich muss mich also keine Gedanken über mögliche Race Conditions machen, aber ich bin immer noch neugierig darauf, wie DB2 die automatische Nummerierung handhabt. Scheint wie jede SQL-Implementierung es anders macht. "Das Schöne an Standards ist, dass es so viele zu wählen gibt." Ich denke ... – Sam

Antwort

0

Der eindeutige Index für URID generiert keine ID-Nummern automatisch.

Der DB2-Weg, dies zu tun, ist ein VERSÄUMNIS oder ERSTELLT IMMER auf Ihre URID Spaltendefinition ERSTELLT hinzuzufügen:

URID int NOT NULL 
    GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) 
    UNIQUE 

VERSÄUMNIS ERSTELLT lassen Sie einen benutzerdefinierten Wert angeben, wenn Sie es brauchen.

Ich empfehle, über die Dokumentation für die CREATE TABLE Anweisung zu schauen.

+0

Ich sah GENERATED BY DEFAULT/IMMER in den DB2-Dokumenten, aber ich habe das nicht in der Tabellenerstellungsanweisung, die ich aufgelistet habe, gesehen oben, also habe ich unter der Annahme gearbeitet, dass diese Tabelle das nicht verwendete ... Für was es wert ist, verwende ich den SQuirreL SQL-Client mit der JDBC-ODBC-Brücke, und ich bin mir nicht ganz sicher, ob es angezeigt wird Genau mit was die Tabelle erstellt wurde.Gibt es eine andere Quelle der automatischen Nummerierung, die DB2 möglicherweise verwendet? – Sam

+0

Ich bin nicht sicher, in welcher Version von DB2 sie eingeführt wurden, aber Sie können auch Sequenzen verwenden. Die Dokumentation für CREATE SEQUENCE (http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2z10.doc.sqlref/db2z_sql_createsequence.htm) enthält einige Beispiele. – Leons

Verwandte Themen