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

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

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

錯誤訊息 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)
建立唯一索引
建立唯一的條件約束