2009-12-28 3 views
1

J'utilise SQL Server 2008 avec une table avec une colonne id (numérique) comme clé primaire. A également eu un index unique sur trois colonnes varchar. J'ai été en mesure d'ajouter une ligne avec exactement le même ensemble des trois colonnes. Je l'ai vérifié avec une simple requête sur les valeurs et 2 lignes ont été retournées.Index unique de SQL Server permettant les doublons

J'ai modifié l'index et ajouté la colonne id. Lorsque j'ai essayé de l'éditer à nouveau et de supprimer la colonne id, il s'est plaint qu'il y avait des lignes en double, il a supprimé l'index mais n'a pas pu le créer. J'ai ensuite nettoyer la base de données du dupliqué, recréé l'index avec les mêmes 3 varchars comme uniques et non clusterisés et maintenant il fonctionne correctement, ne permettant pas les doublons.

Est-ce que quelqu'un sait pourquoi l'unicité de cet index a été ignorée?

+0

L'index n'a pas été désactivé, et les valeurs étaient exactement les mêmes: atsolberg.com/dupPaos.JPG Voici une photo montrant les propriétés de l'index et la requête + résultats de deux lignes retournées. J'ai également ajouté len (*) dans le select pour m'assurer que les valeurs de varchars étaient de la même longueur. De plus, ces lignes ne sont pas des anciennes lignes ajoutées avant que l'index n'existe, elles ont simplement été ajoutées. –

Répondre

5

L'index aurait pu être désactivé (voir Disabling Indexes), vos valeurs 'dupliquées' auraient pu être différentes (espaces finaux par exemple), ou votre test pourrait être incorrect.

Bien sûr, vous n'avez pas inséré de doublon dans un index unique forcé.

+0

L'index n'a pas été désactivé, et les valeurs étaient exactement les mêmes: http://atsolberg.com/dupPaos.JPG Voici une image montrant les propriétés de l'index et la requête + résultats de deux lignes retournées. J'ai également ajouté len (***) dans le select pour m'assurer que les valeurs de varchars étaient de la même longueur. De plus, ces lignes ne sont pas des anciennes lignes ajoutées avant que l'index n'existe, elles ont simplement été ajoutées. –

+0

Repro script et je vais vous croire. –

+0

Il est également important de regarder le paramètre SET ANSI PADDING et le classement sous lequel la clause SELECT WHERE correspond à la valeur. –

0

Je ne suis pas un pro sur ce sujet, mais le paramètre 'est unique' de l'index fait probablement référence à la façon dont l'index est construit/stocké, et non pas à une contrainte. Cela signifie probablement que la performance de l'indice est sous-optimale. Lors de la création de l'index, le SGBD peut vérifier cela.