MSSQLSERVER_1505
新增: 2008 年 11 月 17 日
詳細資料
產品名稱 |
SQL Server |
產品版本 |
9.0 |
產品組建編號 |
9.00.1399.60 |
事件識別碼 |
1505 |
事件來源 |
MSSQLSERVER |
元件 |
SQLEngine |
符號名稱 |
|
訊息文字 |
發現物件名稱 '%.*ls' 和索引名稱 '%.*ls' 的重複索引鍵,CREATE UNIQUE INDEX 已結束。重複的索引鍵值為 %ls。 |
說明
當您嘗試建立唯一索引,而且資料表中的多個資料列包含指定的重複值時,就會發生這項錯誤。當您建立索引並指定 UNIQUE 關鍵字,或是建立 UNIQUE 條件約束時,就會建立唯一索引。資料表無法包含在索引或條件約束中定義之資料行具有重複值的任何資料列。
請考慮下列 Employee 資料表中的資料:
LastName | FirstName | JobTitle | HireDate |
---|---|---|---|
Walters |
Rob |
Senior Tool Designer |
2004-11-19 |
Brown |
Kevin |
Marketing Assistant |
NULL |
Brown |
Jo |
Design Engineer |
NULL |
Walters |
Rob |
Tool Designer |
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 時導致唯一性違規的可能性。
- 若重複值是因資料輸入錯誤所造成,請手動更正資料,然後再建立索引或約束條件。如需有關在資料表中移除重複資料列的詳細資訊,請參閱知識庫文件 139444:<如何從 SQL Server 的資料表中移除重複的資料列>(機器翻譯)。
請參閱
其他資源
CREATE INDEX (Transact-SQL)
建立唯一索引
如何:建立唯一條件約束 (Visual Database Tools)
建立和修改 UNIQUE 條件約束