MSSQLSERVER_1505
Nouveau : 17 novembre 2008
Détails
Nom du produit |
SQL Server |
Version du produit |
9.0 |
Numéro de build du produit |
9.00.1399.60 |
ID d'événement |
1505 |
Source de l'événement |
MSSQLSERVER |
Composant |
SQLEngine |
Nom symbolique |
|
Texte du message |
L'instruction CREATE UNIQUE INDEX a été interrompue, car une clé dupliquée a été trouvée pour l'objet '%.*ls' et l'index '%.*ls'. Valeur de clé dupliquée : %ls. |
Explication
Cette erreur se produit lorsque vous tentez de créer un index unique et que plusieurs lignes dans la table contiennent la valeur dupliquée spécifiée. Un index unique est créé lorsque vous créez un index et que vous spécifiez le mot clé UNIQUE ou lorsque vous créez une contrainte UNIQUE. La table ne peut pas contenir de ligne qui contient des valeurs dupliquées dans les colonnes définies dans l'index ou la contrainte.
Prenons comme exemple les données de la table Employee suivante :
LastName | FirstName | JobTitle | HireDate |
---|---|---|---|
Walters |
Rob |
Senior Tool Designer |
2004-11-19 |
Brown |
Kevin |
Marketing Assistant |
NULL |
Brown |
Jo |
Design Engineer |
NULL |
Walters |
Rob |
Tool Designer |
2001-08-09 |
Il est impossible de créer un index unique sur les combinaisons de colonnes LastName ou LastName, FirstName à cause des valeurs dupliquées dans les lignes.
Le risque de violation d'unicité dans la colonne HireDate est moins évident. À des fins d'indexation, les valeurs NULL sont comparées comme étant égales. Par conséquent, il est impossible de créer une contrainte ou un index unique si les valeurs de clés sont des valeurs NULL dans plusieurs lignes. Avec les données ci-dessus, il est impossible de créer un index unique sur les combinaisons de colonnes HireDate ou LastName, HireDate.
Le message d'erreur 1505 retourne la première ligne qui enfreint la contrainte d'unicité. Il peut exister d'autres lignes dupliquées dans la table. Pour trouver toutes les lignes dupliquées, interrogez la table spécifiée et utilisez les clauses GROUP BY et HAVING pour signaler les lignes dupliquées. Par exemple, la requête suivante retourne les lignes dans la table Employee qui possèdent des prénoms et des noms dupliqués.
SELECT LastName, FirstName, count(*) FROM dbo.Employee GROUP BY LastName, FirstName HAVING count(*) > 1;
Action utilisateur
Considérez les solutions suivantes :
- Ajoutez ou supprimez des colonnes dans la définition de l'index ou de la contrainte afin de créer un composite unique. Dans l'exemple précédent, l'ajout d'une colonne MiddleName à la définition de l'index ou de la contrainte pourrait résoudre le problème des valeurs dupliquées.
- Sélectionnez les colonnes définies comme NOT NULL lorsque vous choisissez des colonnes pour un index ou une contrainte unique. Cela élimine le risque de violation d'unicité provoqué lorsque plusieurs lignes contiennent NULL dans les valeurs de clés.
- Si les valeurs dupliquées sont issues d'erreurs de saisie des données, corrigez manuellement les données, puis créez l'index ou la contrainte. Pour plus d'informations sur la suppression des lignes dupliquées dans une table, consultez l'article 139444 : Comment faire pour supprimer des lignes en double d'une table dans SQL Server (en anglais) dans la Base de connaissances Microsoft.
Voir aussi
Autres ressources
CREATE INDEX (Transact-SQL)
Création d'index uniques
Procédure : créer des contraintes uniques (Visual Database Tools)
Création et modification des contraintes UNIQUE