掌握 MySQL 四大數據操作語句(DML)的語法細節、行為差異與最佳實踐,是開發高質量數據訪問層的前提。本文系統對比 INSERT/REPLACE/UPDATE/DELETE/TRUNCATE 核心特性。
-- 標準 SQL 風格(列值分離)
INSERT INTO users (id, name, age) VALUES (123, '張三', 25);
-- MySQL 擴展 SET 風格(列值配對)
INSERT INTO users SET id = 123, name = '張三', age = 25;
差異:SET 風格允許部分列賦值、列值直觀對應、便於動態構建;VALUES 風格標準、支持多行批量插入。
-- 單條 INSERT 循環:N 次解析、優化、網絡往返
-- 批量 INSERT:一次解析、一次網絡往返
INSERT INTO users (name, age) VALUES
('張三', 25), ('李四', 30), ('王五', 28);
VALUES (1,2,3,4,5) 錯誤,需 VALUES (1),(2),(3),(4),(5)max_allowed_packetREPLACE INTO users (id, name, age) VALUES (123, '趙六', 35);
| 場景 | INSERT | REPLACE |
|---|---|---|
| 主鍵衝突 | 報錯 1062 | 靜默替換 |
| 部分列更新 | INSERT ... ON DUPLICATE KEY UPDATE | 全行替換(缺失列填默認值) |
| 觸發器 | BEFORE/AFTER INSERT | BEFORE/AFTER DELETE + INSERT |
| 自增 ID | 衝突時不消耗 | 舊行刪除,新行重新分配 |
UPDATE users SET age = 26, name = '張三豐' WHERE id = 123;
TIMESTAMP 列:其他列更新時自動刷新為當前時間| 維度 | UPDATE | REPLACE |
|---|---|---|
| 無匹配行 | 無操作,返回 0 | 插入新行 |
| 部分列修改 | 支持 | 全行替換 |
| 唯一索引要求 | 無 | 必須有 |
| 特性 | DELETE | TRUNCATE TABLE |
|---|---|---|
| WHERE 支持 | 是 | 否(全表) |
| 返回行數 | 實際刪除行數 | 0 |
| 自增重置 | 否(除非 WHERE 恆真) | 是(重置為 1) |
| 觸發器 | 觸發 DELETE | 不觸發 |
| 速度 | 逐行刪除,慢 | 釋放數據頁,極快 |
| 事務安全 | 支持回滾 | 隱式提交,不可回滾 |
| 鎖機制 | 行鎖 | 表鎖 |
DELETE FROM users WHERE 1; -- 恆真條件,掃描全表但保留自增計數器
-- 刪除名為 Mike 的前 6 條(按 id 降序)
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6;
INSERT ... VALUES (...),(...) 或 LOAD DATA INFILEREPLACE,需保留其他列值用 INSERT ... ON DUPLICATE KEY UPDATETRUNCATE,需保留自增值或條件刪除用 DELETEDELETE/UPDATE 必加 WHERE,建議先 SELECT 驗證影響範圍精準選擇 DML 語句,兼顧業務語義、性能與數據安全。