web-dev-qa-db-fra.com

Impossible de créer un index en raison d'un doublon qui n'existe pas?

Je reçois une erreur lors de l'exécution de la commande Transact-SQL suivante:

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

L'erreur est:

Msg 1505, niveau 16, état 1, ligne 1 L'instruction CREATE UNIQUE INDEX s'est terminée car une clé en double a été trouvée pour le nom d'objet "dbo.DimMeasureTopic" et le nom d'index "IX_TopicShortName". La valeur de clé en double est ().

Lorsque j'exécute SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName' Ou SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]') l'index IX_TopicShortName ne s'affiche pas. Il ne semble donc pas y avoir de doublon.

J'ai le même schéma dans une autre base de données et je peux créer l'index sans problèmes là-bas. Des idées pourquoi cela ne se créera pas ici?

46
Alex Angas

Ce n'est pas que l'index existe déjà, mais qu'il existe des valeurs en double du champ TopicShortName dans la table elle-même. Selon le message d'erreur, la valeur en double est une chaîne vide (cela pourrait être une facette de la publication, je suppose). Ces doublons empêchent la création d'un index UNIQUE.

Vous pouvez exécuter une requête pour confirmer que vous avez un doublon:

SELECT
    TopicShortName,
    COUNT(*)
FROM
    DimMeasureTopic
GROUP BY
    TopicShortName
HAVING
    COUNT(*) > 1

Vraisemblablement dans l'autre base de données, les données sont différentes et les doublons ne sont pas présents.

87
martin clayton

Le doublon est dans vos données, essayez d'exécuter cette requête pour le trouver.

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
12
Donald Byrd

C'est parce que vous avez déjà des enregistrements dans la table qui ne sont pas uniques (par les sons de celui-ci, 2 enregistrements avec une valeur vide dans le champ TopicShortName).

Il s'agit donc des données, pas de l'index lui-même.

5
AdaTheDev

Si vous utilisez des migrations basées sur du code et que vous renommez une propriété d'une entité et que vous disposez d'un index unique pour la propriété, le framework d'entité créera une nouvelle colonne et tentera d'ajouter un index unique pour la nouvelle colonne mais la nouvelle colonne a toutes les valeurs nulles, donc il échouera. Vous devez modifier manuellement le code de migration pour copier les données de l'ancienne colonne avant la ligne pour créer l'index.

3
Ming Lu

Il aurait dû spécifier la valeur de clé en double dans le message d'erreur. "La valeur de clé en double est ('', '', '') L'instruction est terminée. Vous avez des valeurs en double qui doivent être traitées.

0
DBA