Violation de contrainte d'unicité insert: pourquoi? (Oracle)
Je suis en train de créer une nouvelle ligne dans une table. Il y a deux contraintes sur la table, l'une sur le champ de clé (DB_ID), l'autre limite d'une valeur à être l'un de plusieurs la le terrain ENV. Quand je fais un insert, je ne comprend pas le champ de clé comme l'un des domaines que j'essaie d'insérer, mais j'obtiens cette erreur:
unique constraint (N390.PK_DB_ID) violated
Voici le SQL qui provoque l'erreur:
insert into cmdb_db
(narrative_name, db_name, db_type, schema, node, env, server_id, state, path)
values
('Test Database', 'DB', 'TYPE', 'SCH', '', 'SB01', 381, 'TEST', '')
La seule chose que je ai été en mesure de tourner, c'est la possibilité que l'Oracle pourrait être d'essayer d'attribuer une déjà en cours d'utilisation DB_ID si des lignes ont été insérées manuellement. Les données dans cette base de données a été en quelque sorte d'une restauration/déplacé à partir d'une base de données de production, mais je n'ai pas les détails quant à la façon dont cela a été fait.
Toutes les pensées?
OriginalL'auteur Sean | 2011-09-27
Vous devez vous connecter pour publier un commentaire.
Sans doute, puisque vous n'êtes pas fournir une valeur pour le
DB_ID
colonne, cette valeur est remplie par un niveau de la ligne avant de déclencheur d'insertion défini sur la table. Que le déclencheur, sans doute, est la sélection de la valeur à partir d'une séquence.Depuis que les données ont été déplacés (sans doute récente) à partir de la base de données de production, mon pari serait que lorsque les données ont été copiées, la séquence n'a pas été modifié. Je suppose que la séquence est de générer des valeurs qui sont beaucoup plus bas que le plus grand
DB_ID
qui est actuellement dans le tableau conduisant à l'erreur.Vous pourrait confirmer cette hypothèse en regardant sur le déclencheur pour déterminer la séquence est utilisé et de faire un
et en comparant à
Si, comme je le soupçonne, la séquence est de générer des valeurs qui existent déjà dans la base de données, vous pouvez incrémenter la séquence jusqu'à ce qu'il génère des valeurs inutilisées ou vous pouvez le modifier de manière à définir la
INCREMENT
à quelque chose de très grand, obtenir le nextval une fois, et de définir laINCREMENT
à 1.OriginalL'auteur Justin Cave
Votre erreur dirait que vous êtes de la duplication d'un déjà existant de la Clé Primaire dans votre base de données. Vous devez modifier votre code sql pour mettre en œuvre sa propre clé primaire en utilisant quelque chose comme l'IDENTITÉ de mot-clé.
C'est une instruction non valide pour Oracle
Vous, monsieur, sont corrects. Ma solution fonctionne dans SQL, pas dans Oracle. Si vous voulais en double SQL Identité Oracle, vous pouvez utiliser des Séquences lien @Justin_Cave a une amende de mise en œuvre dans sa réponse.
OriginalL'auteur Christopher Rayl
Il semble que vous n'êtes pas fournir une valeur pour le champ de clé primaire DB_ID. Si c'est une clé primaire, vous devez fournir une valeur pour cette colonne. La seule façon de ne pas fournir ce serait créer une base de données de déclenchement qui, lors de l'insertion, qui donnerait une valeur, probablement dérivée d'une séquence.
Si c'est une restauration à partir d'une autre base de données et il y a une séquence sur cette nouvelle instance, il peut être essayer de réutiliser une valeur. Si les anciennes données unique touches de 1 à 1000 et de votre séquence est à 500, il serait générer des valeurs qui existent déjà. Si une séquence n'existe pas pour cette table et il essaie de l'utiliser, vous avez besoin de concilier les valeurs de votre tableau avec la valeur courante de la séquence.
Vous pouvez utiliser SEQUENCE_NAME.CURRVAL pour voir la valeur courante de la séquence (si elle existe bien sûr)
Êtes-vous en mesure d'interroger le dictionnaire de données pour voir si les déclencheurs nécessaires/séquences existent dans le nouvel environnement? Peut-être que tout n'a pas été fait à partir de l'ancien environnement.
OriginalL'auteur Brett McCann