2010-02-01 35 views
34

我得到一個錯誤運行下面的Transact-SQL命令:無法創建索引,因爲重複不存在?

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName 
ON DimMeasureTopic(TopicShortName) 

的錯誤是:

消息1505,級別16,狀態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索引不顯示。所以似乎沒有重複。

我在另一個數據庫中具有相同的模式,並且可以在那裏創建沒有問題的索引。任何想法,爲什麼它不會在這裏創建?

回答

69

這並不是說索引已經存在,而是表格本身有TopicShortName字段的重複值。根據錯誤消息,重複值是一個空字符串(它可能只是我猜測發佈的一個方面)。這樣的重複項可以防止創建UNIQUE索引。在其他數據庫中的數據是不同的推測

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

,並重復不存在:

您可以運行一個查詢,以確認是否有重複。

+1

這是3次我GOOGLE了這個錯誤,並最終在這裏謝謝。也爲了將來的參考,我添加了代碼來刪除重複項。希望這是確定刪除 FROM DimMeasureTopic WHERE ID NOT IN ( SELECT MAX(ID) FROM DimMeasureTopic GROUP BY TopicShortName) – Dowlers 2014-03-06 23:24:25

+0

你是生命的救星 – Yiping 2017-09-06 12:51:29

+0

希望我能達到這一點,爲我節省了從快要瘋了,每次投票因爲我誤解了那個錯誤信息! – Vaccano 2017-10-09 22:55:47

11

重複項在您的數據中,請嘗試運行此查詢以查找它。

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

這是因爲你必須在表格中不是唯一的(由它的聲音,2條記錄與在TopicShortName字段爲空值)記錄了。

所以,這與數據有關,而不是索引本身。

2

如果您使用的是基於代碼的遷移,並重新命名實體的性質和你有該屬性的唯一索引,實體框架將創建一個新的列,並嘗試添加一個唯一索引新列但是新列有全部空值,因此會失敗。您需要手動修改遷移代碼,以便在創建索引之前複製舊列中的數據。