DML (Data Manipulation Language) 三大核心指令是數據庫增刪改的基石。本文提供標準語法、參數化範例與常見陷阱提示。
-- 完整列插入 (須匹配表定義順序)
INSERT INTO TableName VALUES (Val1, Val2, ...);
-- 指定列插入 (推薦,順序無關、易維護)
INSERT INTO TableName (Col1, Col2, ...) VALUES (Val1, Val2, ...);
-- 批量插入 (單語句多行,SQL 2008+)
INSERT INTO TableName (Col1, Col2) VALUES
(Val1, Val2), (Val3, Val4), ...;
-- 查詢結果插入
INSERT INTO TargetTable (Col1, Col2)
SELECT ColA, ColB FROM SourceTable WHERE ...;
INSERT INTO Country (CountryName) VALUES (N'中國');
INSERT INTO Country (CountryId, CountryName) VALUES (5, N'美國'); -- 若 CountryId 非 IDENTITY
UPDATE TableName
SET Col1 = Val1, Col2 = Val2, ...
WHERE ; -- 缺少 WHERE 將更新全表!
UPDATE Country
SET CountryName = N'中國'
WHERE CountryId = 4;
DELETE FROM TableName
WHERE ; -- 缺少 WHERE 將清空全表!
DELETE FROM Country WHERE CountryId = 4;
| 場景 | 建議 | 風險 |
|---|---|---|
| 生產環境手動執行 | 先 BEGIN TRAN → 執行 → SELECT 驗證 → COMMIT/ROLLBACK | 誤刪/誤改無法撤銷 |
| 應用代碼 | **務必使用參數化命令**,禁止字符串拼接 | SQL 注入、計劃緩存污染 |
| 大批量操作 | 分批 (TOP 5000/10000) 循環,避免長事務、鎖升級、日志爆漲 | 阻塞、事務日志填滿磁盤 |
| 刪除大表大部分數據 | 考慮 TRUNCATE TABLE (無 WHERE、重置身份列、極快) 或 SWITCH PARTITION | DELETE 逐行記錄日志,極慢 |
| 外鍵約束存在 | DELETE/UPDATE 父表需考慮級聯或先處理子表 | 約束衝突報錯 |
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| WHERE 條件 | 支援 | 不支援 (全表) |
| 觸發器 | 觸發 AFTER DELETE | 不觸發 |
| 身份列重置 | 不重置 | 重置為種子值 |
| 日志量 | 逐行記錄 | 僅記錄頁釋放 (極少) |
| 權限 | DELETE 權限 | ALTER TABLE 權限 |
| 外鍵引用 | 允許 (配合級聯) | 禁止 (必須先刪除/禁用 FK) |
INSERT/UPDATE/DELETE 看似簡單,生產環境下事務控制、參數化、分批、外鍵協調才是決定成敗的關鍵。將最佳實踐內化為肌肉記憶,代碼審查時重點檢查這四點。