資料表出現重複列導致查詢統計不準,傳統游標逐列比對效能極差(百萬列需數小時)。利用唯一索引忽略重複鍵特性,僅需四步驟、幾秒鐘即可完成去重,適用任意資料量。
CREATE TABLE Products_temp (
ProductID int,
ProductName nvarchar(40),
Unit char(2),
UnitPrice money
)
企業管理器 → 暫存表 → 右鍵【所有工作】→【管理索引】→【新增】→ 勾選 「忽略重複鍵」(IGNORE_DUP_KEY = ON),選擇作為唯一鍵的欄位組合(如 ProductName + Unit)。
INSERT INTO Products_temp SELECT * FROM Products
訊息顯示 「已忽略重複的鍵」,暫存表僅保留唯一列。
DELETE FROM Products
INSERT INTO Products SELECT * FROM Products_temp
DROP TABLE Products_temp
ProductName + Unit 為唯一鍵,若實際業務以 ProductID 為主鍵,則不應建立此索引,否則會誤刪正常資料。| 方法 | 速度 | 程式碼複雜度 | 風險 | 適用場景 |
|---|---|---|---|---|
| 游標逐列 | 極慢 (O(n²)) | 高 | 長時間鎖表 | 極小資料量、複雜去重邏輯 |
| 唯一索引法 | 極快 (批次操作) | 低 (4 陳述式) | 需正確定義唯一鍵 | 大量資料、標準去重需求 |
| ROW_NUMBER() 窗口函數 (SQL 2005+) | 快 | 中 | 較低 | 現代版本、需保留特定列(如最新) |
INSERT INTO temp SELECT * FROM Products ORDER BY ModifiedDate DESC,配合唯一索引保留首筆。SET ROWCOUNT 10000 迴圈處理(SQL 2000)或 TOP (n)(SQL 2005+)。唯一索引忽略重複鍵技巧,是 SQL Server 2000 時代處理大量資料去重的經典高效解法,理解其原理有助於遷移至新版本時選擇最佳策略。