首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 快速移除資料表重複列:IGNORE_DUP_KEY 索引技巧

     編輯:關於SqlServer

需快速去除資料表重複列且不想寫複雜 ROW_NUMBER() 或 CTE?利用 IGNORE_DUP_KEY 索引特性,三行指令搞定。

核心技巧

-- 1. 建立結構相同的暫存表
SELECT * INTO #Table_Copy FROM SourceTable WHERE 1=0;

-- 2. 建立唯一索引並啟用 IGNORE_DUP_KEY
CREATE UNIQUE INDEX IX_RemoveDup ON #Table_Copy (KeyColumn) WITH IGNORE_DUP_KEY;

-- 3. 批次匯入原表資料,重複列自動略過
INSERT INTO #Table_Copy SELECT * FROM SourceTable;

-- 4. 結果在 #Table_Copy,可選取回原表或重建
-- TRUNCATE TABLE SourceTable;
-- INSERT INTO SourceTable SELECT * FROM #Table_Copy;

運作原理

  • IGNORE_DUP_KEY 讓唯一索引在大量插入時,遇到重複鍵值僅忽略該列並繼續,不會整批回滾、不會拋錯誤(僅回傳警告訊息)。
  • 適用於 SQL Server 2000 至最新版,效能極佳(單一掃描 + 索引維護)。

注意事項

  1. 目標欄位/欄位組合必須能唯一識別一列(業務主鍵)。
  2. 若原表有 IDENTITY 欄位,匯入前需 SET IDENTITY_INSERT ON 或重新設計索引鍵。
  3. 大量資料(> 100 萬列)建議分批或配合 TABLOCK 提升效能。
  4. 索引建立會鎖定表,離線維護窗口執行最佳。

現代替代方案(SQL 2005+)

WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY KeyColumn ORDER BY (SELECT 0)) AS RN
    FROM SourceTable
)
DELETE FROM CTE WHERE RN > 1;

CTE 寫法可讀性高、支援複雜去重邏輯(如保留最新/最舊),但中小表用 IGNORE_DUP_KEY 更簡潔快速。

掌握此技巧,臨時去重需求秒級解決,無需撰寫冗長 T-SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved