2010-12-28 2 views
0

Ayant obtenu une réponse à un problème Java que j'avais la semaine dernière (merci!), Je suis maintenant à un nouveau problème avec DB2 ... L'application Java sur laquelle je travaille prend des données de un formulaire Web et met dans un fichier DB2 (base de données). La chaîne SQL qui est passé à l'objet Java PreparedStatement est:DB2 unique index et autonumbering

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 (
     ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? 
    ) 

Voici le script de création de table:

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); 

Comme vous pouvez le voir, il est passe dans toutes les valeurs dans la chaîne SQL à l'exception du premier, URID. Après qu'un enregistrement est inséré, je peux le voir dans la base de données avec un numéro d'identification, ce qui implique que la base de données ajoute automatiquement l'URID (c'est-à-dire que l'ID n'est pas généré dans le code Java).). Dans ma précédente expérience avec Oracle et PHP, j'ai utilisé Oracle Sequences pour créer des champs auto-numérotés, et je suis conscient qu'il y a des fonctionnalités similaires dans MySQL, Postgres et probablement d'autres systèmes de bases de données, mais je n'ai pas trouvé comment le numérotage automatique fonctionne dans DB2.

Mon collègue qui est plus familier avec DB2 est également perplexe; il dit qu'il n'y a pas de Triggers installés sur la table en fonction de ce qu'il a regardé, et que généralement dans le code RPG il semble que les numéros d'ID sont générés dans le code et ensuite transmis à la base de données, plutôt que générés par la base de données lui-même. Donc ma question est la suivante: Est-ce que l'Index Unique sur URID génère aussi des numéros d'ID, ou est-ce qu'il y a autre chose que je dois rechercher dans la base de données ou dans le code Java? Et ma question de suivi est la suivante: j'aurai éventuellement besoin d'utiliser le numéro URID pour l'insérer dans une autre table stockant des données connexes. Dans Oracle, cela a été fait avec "insert into return into" et ensuite récupérer les données de la variable id_ paramétrée dans le code. Y a-t-il une fonctionnalité similaire dans DB2? J'ai trouvé la documentation sur une fonction IDENTITY_VAL_LOCAL, mais il ne semble pas que je puisse toujours garantir qu'elle renverra l'ID correct, par exemple si un autre insert arrive du formulaire web entre le premier insert et l'invocation de IDENTITY_VAL_LOCAL ...

Je peux fournir des exemples de code ou d'autres informations de base de données si nécessaire. Merci!

+0

Je pense que vous constaterez que IDENTITY_VAL_LOCAL est scope à la connexion ... – kem

+0

@kem: Je suis heureux de dire que j'ai trouvé une méthode Java qui retourne le dernier ID utilisé (prepareStatement (sql, Statement.RETURN_GENERATED_KEYS)), donc je n'ai pas à m'inquiéter des conditions de course potentielles, mais je suis toujours curieux de savoir comment DB2 gère l'autonumérotation. On dirait que chaque implémentation SQL le fait différemment. "La bonne chose à propos des standards est qu'il y a tellement de choix" Je suppose ... – Sam

Répondre

0

L'index unique sur URID n'énumère pas automatiquement les numéros d'ID.

La façon de DB2 pour ce faire est d'ajouter une GÉNÉRÉE PAR DÉFAUT ou GÉNÉRÉE TOUJOURS à votre colonne URID Définition:

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

GÉNÉRÉ PAR DÉFAUT vous permettra de spécifier une valeur personnalisée si vous en avez besoin.

Je recommande de consulter la documentation de l'instruction CREATE TABLE.

+0

J'ai vu GENERATED BY DEFAULT/ALWAYS dans les documents DB2, mais je ne l'ai pas vu dans l'instruction de création de table que j'ai listée ci-dessus, donc fonctionnait sous l'hypothèse que cette table n'utilisait pas ça ... Pour ce que ça vaut, j'utilise le client SQL SQuirreL avec le pont JDBC ODBC, et je ne suis pas tout à fait sûr si ça se voit exactement ce que la table a été créée avec.Existe-t-il une autre source de numérotation automatique que DB2 peut utiliser? – Sam

+0

Je ne suis pas sûr de la version de DB2 dans laquelle ils ont été introduits, mais vous pouvez également utiliser des séquences. La documentation de CREATE SEQUENCE (http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2z10.doc.sqlref/db2z_sql_createsequence.htm) contient quelques exemples. – Leons

Questions connexes