MSSQLSERVER_1505

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 1505
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 DUP_KEY
訊息文字 CREATE UNIQUE INDEX 已終止,因為找不到物件名稱 '%.*ls' 和索引名稱 '%.*ls' 的重複索引鍵。 重複的索引鍵值為 %ls。

說明

當您嘗試建立唯一索引且數據表中的一個以上的數據列包含指定的重複值時,就會發生此錯誤。 當您建立索引並指定 UNIQUE 關鍵詞,或當您建立 UNIQUE 條件約束時,就會建立唯一索引。 數據表不能包含索引或條件約束中定義之數據行中具有重複值的任何數據列。

請考慮下列 Employee 資料表中的數據:

LastName FirstName JobTitle 僱用日期
沃爾特斯 資深工具設計師 2004-11-19
棕色 Kevin 行銷助理 NULL
棕色 Jo 設計工程師 NULL
沃爾特斯 資深工具設計師 2001-08-09

由於數據列中有重複的值,因此無法在數據行組合 LastNameLastName、FirstName 上建立唯一索引。

較不明顯的是HireDate數據行中唯一違規的可能性。 為了編製索引,NULL 值會比較為相等。 因此,如果索引鍵值在多個數據列中為 NULL,則無法建立唯一索引或條件約束。 根據上述數據,無法在HireDateLastNameHireDate的數據行組合上建立唯一索引。

錯誤訊息 1505 會傳回違反唯一性條件約束的第一個數據列。 數據表中可能有其他重複的數據列。 若要尋找所有重複的數據列,請查詢指定的數據表,並使用 GROUP BY 和 HAVING 子句來報告重複的數據列。 例如,下列查詢會傳回 Employee 資料表中具有重複名字和姓氏的數據列。

SELECT LastName, FirstName, count} FROM dbo.Employee GROUP BY LastName, FirstName HAVING count\ > 1;

使用者動作

請考慮下列解決方案。

  • 在索引或條件約束定義中新增或移除數據行,以建立唯一的複合。 在上一個範例中,將 MiddleName 數據行新增至索引或條件約束定義可能會解決重複問題。

  • 當您選擇唯一索引或條件約束的數據行時,請選取定義為 NOT NULL 的數據行。 這可消除當索引鍵值中有多個數據列包含NULL時,造成唯一性違規的可能性。

  • 如果重複值是數據輸入錯誤的結果,請手動更正數據,然後建立索引或條件約束。 如需移除數據表中重複數據列的相關信息,請檢閱 從 SQL Server 數據表移除重複的數據列。

另請參閱

CREATE INDEX (Transact-SQL)
建立唯一索引
建立唯一的條件約束