萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

SQL Server 資料刪除與更新完全指南:DELETE、TRUNCATE 與 UPDATE 實戰

資料操作語言(DML)中的刪除與更新是資料庫日常維護的核心。本文系統整理 DELETE、TRUNCATE 的差異、UPDATE 進階用法(含 REPLACE 函數),助您精準、高效地維護資料。

一、資料刪除:DELETE vs TRUNCATE

1. DELETE:精準刪除,支援條件與觸發器

DELETE FROM TableName WHERE Id = 'xx';
  • 可搭配 WHERE 刪除特定列。
  • 會觸發 ON DELETE 觸發器。
  • 逐列記錄交易日誌,可回滾。
  • 不重設識別欄位種子。

2. TRUNCATE:高效清空,重設種子

TRUNCATE TABLE TableName;
  • 清空整張表,**無法加 WHERE 條件**。
  • **不觸發觸發器**。
  • 最小化日誌記錄(僅記錄頁面釋放),**效能極高**。
  • **重設識別欄位種子** 回初始值。
  • 需 ALTER TABLE 權限;被外鍵參考時不可用。

3. 核心差異對照表

特性DELETETRUNCATE
支援 WHERE是否
觸發觸發器是否
日誌記錄量逐列(大)頁面級(極小)
重設 Identity 種子否是
執行速度較慢極快
可回滾是是(在交易中)

二、資料更新:UPDATE 進階應用

1. 基礎單表更新

UPDATE TableName
SET ColumnName = 'NewValue'
WHERE ConditionColumn = 'ConditionValue';

2. 搭配 REPLACE 函數進行字串批次替換

需求:將年齡 > 19 之使用者的姓名中「星」替換為「★」。

UPDATE TableName
SET Name = REPLACE(Name, '星', '★')
WHERE Age > 19;
  • REPLACE(column, old_str, new_str) 會替換**所有**出現的 old_str。
  • 若需區分大小寫,可搭配 COLLATE 指定校對規則。

3. 進階:跨表更新(UPDATE ... FROM)

UPDATE t
SET t.Status = s.NewStatus
FROM TargetTable t
JOIN SourceTable s ON t.Id = s.RefId
WHERE s.IsValid = 1;

4. 進階:使用 CASE 條件更新

UPDATE Products
SET Price = CASE
    WHEN Category = 'A' THEN Price * 1.1
    WHEN Category = 'B' THEN Price * 0.9
    ELSE Price
END;

三、實務建議

  1. 大量刪除:優先考慮 TRUNCATE(清空全表)或分批 DELETE TOP (N) 避免日誌暴增。
  2. 誤刪救援:DELETE 可在交易中 ROLLBACK;TRUNCATE 亦可在顯式交易中回滾,但交易結束後無法透過日誌單獨還原單列。
  3. 更新前備份:關鍵業務更新前,建議 SELECT INTO BackupTable 保留快照。
  4. 避免全表掃描:WHERE 條件欄位務必加索引。

熟練掌握刪除與更新的細節差異,能讓您在資料維護、ETL 流程、錯誤修復等場景中游刃有餘,守護資料完整與效能。

copyright © 萬盛學電腦網 all rights reserved