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

SQL Server 刪除重複資料四步驟:唯一索引 + INSERT IGNORE 替代游標大幅提升效能

     編輯:關於SqlServer

刪除重複列是開發常見痛點。游標逐列比對在百萬列級別效能極差。利用唯一索引忽略重複鍵特性,四步驟完成高效去重。

情境:Products 表含重複產品名稱

CREATE TABLE Products (
    ProductID INT,
    ProductName NVARCHAR(40),
    Unit CHAR(2),
    UnitPrice MONEY
)

原始資料含重複

四步驟去重法

  1. 建立同結構暫存表:CREATE TABLE Products_temp (...)
  2. 加上唯一索引並勾選「忽略重複鍵」:在 Enterprise Manager → 管理索引 → 新增 → 選擇去重欄位(如 ProductName) → 勾選 [Ignore duplicate keys]。
    索引設定
  3. 複製資料:INSERT INTO Products_temp SELECT * FROM Products
    SQL Server 回傳:「已忽略重複的鍵。」暫存表自動去重。
  4. 覆蓋回原表:DELETE Products; INSERT INTO Products SELECT * FROM Products_temp; DROP TABLE Products_temp

優勢分析

  • 效能:集合式操作,無游標逐列開銷,百萬列秒級完成。
  • 安全:幾乎無手寫複雜邏輯,錯誤風險極低。
  • 彈性:去重鍵由索引欄位決定,業務調整只需修改索引定義。

關鍵提醒

去重鍵選擇直接決定保留哪些列。操作前務必確認唯一索引欄位組合符合業務定義,避免誤刪有效資料。

現代替代方案 (SQL 2005+)

;WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductName ORDER BY ProductID) AS rn
    FROM Products
)
DELETE FROM cte WHERE rn > 1

CTE + 視窗函數更靈活,可精確控制保留邏輯(如保留最新/最舊/最低價)。

總結

「唯一索引 + IGNORE_DUP_KEY + INSERT SELECT」是 SQL Server 2000 時代去重的經典最佳實務;新版本優先使用 ROW_NUMBER() 視窗函數。核心精神:用集合思維替代逐列迴圈。

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