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!
Je pense que vous constaterez que IDENTITY_VAL_LOCAL est scope à la connexion ... – kem
@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