由于重复不存在而无法创建索引?

Ale*_*gas 47 t-sql indexing sql-server-2005 unique-index

我在运行以下Transact-SQL命令时遇到错误:

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)
Run Code Online (Sandbox Code Playgroud)

错误是:

消息1505,级别16,状态1,行1 CREATE UNIQUE INDEX语句终止,因为找到了对象名称'dbo.DimMeasureTopic'和索引名称'IX_TopicShortName'的重复键.重复键值为().

当我运行SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')IX_TopicShortName索引不显示时.所以似乎没有重复.

我在另一个数据库中有相同的模式,可以在那里创建没有问题的索引.任何想法为什么它不会在这里创造?

mar*_*ton 89

并不是索引已经存在,而是TopicShortName表中的字段有重复值.根据错误消息,重复值是一个空字符串(它可能只是发布的一个方面我猜).这样的重复可以防止创建UNIQUE索引.

您可以运行查询以确认您有重复:

SELECT
    TopicShortName,
    COUNT(*)
FROM
    DimMeasureTopic
GROUP BY
    TopicShortName
HAVING
    COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

据推测,在其他数据库中,数据不同,并且不存在重复数据.


Don*_*yrd 12

副本位于您的数据中,尝试运行此查询以查找它.

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)


Ada*_*Dev 5

这是因为表中的记录已经不是唯一的(通过它的声音,在TopicShortName字段中有2个空白值的记录).

所以,它与数据有关,而不是索引本身.


小智 5

如果您使用基于代码的迁移,并且重命名实体的属性并且该属性具有唯一索引,则实体框架将创建一个新列并尝试为新列添加唯一索引,但新列具有所有空值,因此它将失败。您需要手动修改迁移代码以从创建索引的行之前的旧列中复制数据。