DB2 double de la clé d'erreur lors de l'insertion, MAIS le travail après select count(*)
J'ai un - pour moi inconnue - et je ne sais pas quelle est la logique/cause derrière elle. Lorsque j'essaie d'insérer un enregistrement dans une table-je obtenir une base de données DB2 d'erreur disant:
[SQL0803] Duplicate key value specified: A unique index or unique constraint *N in *N
exists over one or more columns of table TABLEXXX in SCHEMAYYY. The operation cannot
be performed because one or more values would have produced a duplicate key in
the unique index or constraint.
Qui est un message clair pour moi. Mais en fait il n'y aurait pas de clé en double si j'ai inséré mon nouveau record de voir ce que les enregistrements sont déjà là. Quand je fais un SELECT COUNT(*) from SCHEMAYYY.TABLEXXX
et puis essayez d'insérer le dossier, il fonctionne parfaitement.
Comment se peut-il que lors de l'exécution de la SELECT COUNT(*)
je peux soudain insérer les enregistrements? Est-il une sorte d'index associés qui peuvent donner des problèmes, car il est hors de synchronisation? Je n'ai pas de conception du modèle de données, donc je n'ai pas la connaissance profonde du système.
L'original DB2 SQL est:
-- Generate SQL
-- Version: V6R1M0 080215
-- Generated on: 19/12/12 10:28:39
-- Relational Database: S656C89D
-- Standards Option: DB2 for i
CREATE TABLE TZVDB.PRODUCTCOSTS (
ID INTEGER GENERATED BY DEFAULT AS IDENTITY (
START WITH 1 INCREMENT BY 1
MINVALUE 1 MAXVALUE 2147483647
NO CYCLE NO ORDER
CACHE 20 )
PRODUCT_ID INTEGER DEFAULT NULL ,
STARTPRICE DECIMAL(7, 2) DEFAULT NULL ,
FROMDATE TIMESTAMP DEFAULT NULL ,
TILLDATE TIMESTAMP DEFAULT NULL ,
CONSTRAINT TZVDB.PRODUCTCOSTS_PK PRIMARY KEY( ID ) ) ;
ALTER TABLE TZVDB.PRODUCTCOSTS
ADD CONSTRAINT TZVDB.PRODCSTS_PRDCT_FK
FOREIGN KEY( PRODUCT_ID )
REFERENCES TZVDB.PRODUCT ( ID )
ON DELETE RESTRICT
ON UPDATE NO ACTION;
- Pouvez-vous nous montrer la définition de la table de
TABLEXXX
? Qui devrait montrer l'index/contraintes unique que vous avez. Aussi, pouvez-vous montrer l'instruction insert? - Probablement quelque chose de bizarre dans vos définitions, mais oui, il est possible que vous avez un haut niveau d'optimisation, avec votre tableau de statistiques out-of-date. Bien que j'ai pensé que généralement les contraintes uniques ont été appliqués uniquement après la
INSERT
a été tentée... - Ajouté le SQL généré à partir de la table dans le message d'origine.
- Avez-vous trouvé une solution? Est-ce encore qui se passe?
Vous devez vous connecter pour publier un commentaire.
J'aimerais voir les déclarations...mais depuis que cette question est d'un an...je ne vais pas vieux mon souffle.
Je pense que le problème peut être le
GÉNÉRÉ PAR DÉFAUT
Et au lieu de passer la valeur NULL dans la colonne d'identité, vous êtes accidentellement passant de zéro ou une autre valeur en double la première fois autour.
Soit toujours passer la valeur NULL, passer une non-valeur en double ou de passer à GÉNÉRÉ TOUJOURS
Regarder les précédents messages dans le protocole de job et spool pour les détails de ce qui a causé cela. Je ne comprends pas comment les INSÉRER peut tout d'un coup le travail après le COUNT(*). S'il vous plaît laissez-nous savoir ce que vous trouvez.
Car il montre
*N
(ie n/a) que le nom de l'index ou constraing, cela me suggère que l'est n'est pas un standard DB2 objet, et peut donc être une "logique de fichier" [LF] défini avec DDS plutôt que SQL, avec une structure clé différent de ce que vous faisiez votre COUNT(*) sur.Votre boutique peut avoir de meilleurs outils pour afficher les clés sur les fichiers dépendants, mais la méthode ci-dessous permettra de travailler n'importe où.
Si votre table ne peut pas être le réel "fichier physique", cette vérification à l'aide de l'Affichage de la Description du Fichier,
DSPFD TZVDB.PRODUCTCOSTS
, dans un 5250 ("écran vert") de la session.Utiliser l'Écran de la Base de données des Relations de commande,
DSPDBR TZVDB.PRODUCTCOSTS
, pour trouver quels fichiers sont définis sur votre table. Vous pouvez ensuiteDSPFD
sur chacun de ces fichiers pour afficher la définition de la clé d'index. Vérifiez également là que chacun de ces indices est maintenu*IMMED
, plutôt que de*REBUILD
ou*DELAY
. (Un sauvage longshot deviner à distance d'une cause possible de votre étrange anomalie.)Vous trouverez la DB2 for i message du finder ici dans le IBM i 7.1 Centre d'Information ou d'autres communiqués
Est-ce un problème de pagination? il semble que nous obtenir -0803 sur les plaquettes de temps en temps quand une ligne est en cours pour mettre à jour et de ce qu'il se verrouille une page qui contient sans doute l'indice qui est nécessaire pour l'insertion? Ce n'est qu'une supposition, mais il me semble que c'est ce qui se passe.