2010-02-01 21 views
34

Recibo un error al ejecutar el siguiente comando de Transact-SQL:¿No se puede crear el índice debido a un duplicado que no existe?

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName 
ON DimMeasureTopic(TopicShortName) 

El error es:

Msg 1505, nivel 16, estado 1, línea 1 La sentencia CREATE UNIQUE INDEX terminado porque una clave duplicada era para el nombre del objeto 'dbo.DimMeasureTopic' y el índice nombre 'IX_TopicShortName'. El valor de la clave duplicada es().

cuando corro SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName' o SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]') el índice IX_TopicShortName no se muestra. Entonces no parece haber un duplicado.

Tengo el mismo esquema en otra base de datos y puedo crear el índice sin problemas allí. ¿Alguna idea de por qué no creará aquí?

Respuesta

69

No es que el índice ya exista, pero existen valores duplicados del campo TopicShortName en la tabla misma. Según el mensaje de error, el valor duplicado es una cadena vacía (podría ser una faceta de la publicación, supongo). Dichos duplicados impiden la creación de un índice UNIQUE.

podría ejecutar una consulta para confirmar que tiene un duplicado:

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

Es de suponer que en la otra base de datos de los datos son diferentes, y los duplicados no está presente.

+1

Esta es la 3 vez que busqué en Google este error y terminé aquí así que gracias. También para referencia futura agrego código para eliminar duplicados. Esperamos que este sea ok Eliminar DE DimMeasureTopic donde ID NO EN ( SELECT MAX (ID) DE DimMeasureTopic GROUP BY TopicShortName) – Dowlers

+0

Estás protector de la vida – Yiping

+0

Me gustaría poder Answer esto cada vez que me ha salvado de volverse loco porque estoy malentendiendo ese mensaje de error! – Vaccano

11

El duplicado está en sus datos, intente ejecutar esta consulta para encontrarlo.

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

Es porque tiene registros en la tabla ya que no son únicos (por los sonidos de la misma, 2 fichas con un valor en blanco en el campo TopicShortName).

Por lo tanto, tiene que ver con los datos, no con el índice en sí.

2

Si está utilizando migraciones basadas en código, y cambia el nombre de una propiedad de una entidad y tiene un índice exclusivo para la propiedad, entity framework creará una nueva columna e intentará agregar un índice único para la nueva columna pero la nueva columna tiene todos los valores nulos, por lo tanto, fallará. Necesita modificar manualmente el código de migración para copiar los datos de la columna anterior a la línea para crear el índice.

Cuestiones relacionadas