Incapaz de criar índice por causa da duplicata que não existe?
-
24-09-2019 - |
Pergunta
Estou recebendo um erro executando o seguinte comando transact-sql:
CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)
O erro é:
MSG 1505, Nível 16, Estado 1, linha 1 A instrução CREATE INDEX ENCILADO ENCERRADA porque uma chave duplicada foi encontrada para o nome do objeto 'dbo.dimeasuretopic' e o nome do índice 'ix_topicshortname'. O valor da chave duplicado é ().
Quando eu corro SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'
ou SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')
O índice ix_topicshortname não é exibido. Portanto, não parece haver uma duplicata.
Eu tenho o mesmo esquema em outro banco de dados e posso criar o índice sem problemas lá. Alguma idéia de por que não criará aqui?
Solução
Não é que o índice já exista, mas que existem valores duplicados do TopicShortName
campo na própria tabela. De acordo com a mensagem de erro, o valor duplicado é uma string vazia (pode ser apenas uma faceta de postagem, eu acho). Tais duplicatas impedem a criação de um UNIQUE
índice.
Você pode executar uma consulta para confirmar que tem uma duplicata:
SELECT
TopicShortName,
COUNT(*)
FROM
DimMeasureTopic
GROUP BY
TopicShortName
HAVING
COUNT(*) > 1
Presumivelmente, no outro banco de dados, os dados são diferentes e as duplicatas não estão presentes.
Outras dicas
A duplicata está em seus dados, tente executar esta consulta para encontrá -los.
SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
É porque você já tem registros na tabela que não são únicos (pelos sons, 2 registros com um valor em branco no campo TopicShortName).
Portanto, tem a ver com os dados, não com o próprio índice.
Se você estiver usando migrações baseadas em código e renomear uma propriedade de uma entidade e está tendo um índice exclusivo para a propriedade, a Entity Framework criará uma nova coluna e tentando adicionar um índice exclusivo para a nova coluna, mas a nova coluna tem todos os valores nulos, portanto, falhará. Você precisa modificar manualmente o código de migração para copiar os dados da coluna antiga antes da linha para criar índice.
Deveria ter especificado o valor da chave duplicado na mensagem de erro. "O valor da chave duplicado é ('', '', '') a instrução foi encerrada. Você tem valores duplicados que precisam ser abordados.