Teradata colonne d'identité et “Dupliquer unique, le premier de l'erreur de clé de dbname.tablename”
J'ai créé un tableau à l'aide de la définition ci-dessous pour une Teradata colonne d'identité:
ID INTEGER GÉNÉRÉ PAR DÉFAUT DE PIÈCE D'IDENTITÉ (COMMENCER PAR 1 INCRÉMENT DE 1 MINVALUE 0 MAXVALUE 100000000 PAS DE CYCLE), ---- INDEX PRIMAIRE UNIQUE ( ID )
Depuis plusieurs mois, la colonne ID a été fonctionne correctement, la génération automatique d'une unique valeur pour la colonne. Au cours du mois passé, cependant, en apparence, a été par intermittence rapports de l'exception suivante de notre .NET 4.0 ASP.NET app:
Teradata.Client.Provider.TdException: [Teradata Database] [2801] Duplicate unique prime key error in DATABASENAME.TABLENAME.
J'ai été en mesure de reproduire par l'ouverture d'Assistant SQL et l'insertion d'un tas d'enregistrements dans la table avec SQL brut. Comme prévu, la plupart du temps, il vise à insérer avec succès, mais d'autres fois, il serait jeter de l'exception ci-dessus.
Il semble que cette erreur se produit parce que Teradata est d'essayer de générer une valeur pour cette colonne qu'il a déjà généré.
Quelqu'un a une idée de la façon d'aller au fond de ce qui se passe? À tout le moins, je voudrais une certaine façon de déboguer le problème un peu plus profond.
Vous devez vous connecter pour publier un commentaire.
Je voudrais suggérer une modification de la définition de votre identité colonne de
GENERATED ALWAYS
à empêcher l'application ou processus ETL de fournir une valeur qui pourrait avoir été utilisé. En fait, il est recommandé par Teradata que si vous utilisez votreIDENTITY
colonne dans le cadre d'une UPI qu'elle devrait être définie commeGENERATED ALWAYS ... NO CYCLE
EDIT:
Si les besoins de votre entreprise sont telles que vous devez être en mesure de fournir une valeur je voudrais également envisager d'utiliser un domaine qui est en dehors de la plage de valeurs que vous avez mis de côté pour le
IDENTITY
colonne. Vous pouvez utiliser un négatif de domaine ou une plage qui est un ordre de grandeur au-delà de celle de la colonne d'IDENTITÉ. Préférence personnelle serait d'utiliser un négatif de domaine.generated always
vous empêcher de l'insertion de votre propre valeur dans la colonne d'identité? Pour des raisons que je n'expliquerai pas pour l'amour de la garder aussi simple que cela, j'ai besoin de la possibilité de définir ma propre valeur pour ce champ lors de l'insertion d'un nouvel enregistrement, ce qui annule les Teradata du comportement de l'attribution d'une valeur en lui-même. Quand je veux de la base de données afin de générer pour moi, je viens de ne pas inclure le nom du champ dans l'instruction insert.insert into mydb.employee (name, email) values ('bob', '[email protected]')
par opposition àinsert into mydb.employee (id, name, email) values (100, 'bob', '[email protected]')
. Tout cela a été depuis probablement autour de février de cette année. Maintenant, nous commençons à avoir dans notre environnement de dev. Je suis désireux de le corriger avant qu'il ne commence à se produire dans la production, car ce serait mauvais. Quand vous dites négatives de domaine, entendez-vous utiliser des nombres négatifs pour la clé primaire? Si quelqu'un ID pourrait être -100?