SQL 資料操作語言(DML)核心包含 INSERT、UPDATE、DELETE 三大標準指令,MySQL 額外擴充了 REPLACE 與 TRUNCATE TABLE。本文系統整理五大更新語句的語法差異、行為細節與最佳實務。
標準風格(值與欄位分離):
INSERT INTO users (id, name, age) VALUES (123, '姚明', 25);
MySQL 專屬 SET 風格(欄位值成對出現):
INSERT INTO users SET id = 123, name = '姚明', age = 25;
省略自增/預設欄位:
-- 僅指定需賦值欄位
INSERT INTO users (name, age) VALUES ('姚明', 25);
INSERT INTO users SET name = '姚明', age = 25;
INSERT INTO users (name, age)
VALUES ('姚明', 25), ('比爾·蓋茲', 50), ('火星人', 600);
關鍵規則: 每筆資料必須用獨立括號包裹,以逗號分隔。單欄位表錯誤寫法:VALUES (1,2,3) → 正確:VALUES (1),(2),(3)。
當表擁有 唯一索引(Primary Key / Unique Key)且不允許 NULL 時:
INSERT。DELETE 舊列,再 INSERT 新列,回傳影響列數 2。REPLACE INTO users (id, name, age) VALUES (123, '趙本山', 50);
-- 多筆
REPLACE INTO users (id, name, age) VALUES (123, '趙本山', 50), (134, 'Mary', 15);
多重唯一索引情境: 若表有多個唯一索引,單一 REPLACE 可能刪除多筆舊資料(影響列數 > 2)。
UPDATE users SET age = 24, name = 'Mike' WHERE id = 123;
WHERE 無匹配列、或新值等於舊值。TIMESTAMP 欄位在其他欄位更新時會自動刷新。| 特性 | DELETE | TRUNCATE TABLE |
|---|---|---|
| 可指定條件 | ✅ WHERE | ❌ 全表清空 |
| 回傳影響列數 | ✅ | ❌ 固定 0 |
| 自增計數器重置 | ❌ 需 WHERE 1 保留 | ✅ 歸 1 |
| 執行速度 | 較慢(逐列) | 極快(釋放頁面) |
| 支援 ORDER BY / LIMIT | ✅ MySQL 擴充 | ❌ |
| 觸發 Trigger | ✅ | ❌ |
-- 刪除前 6 筆符合條件的資料(配合排序)
DELETE FROM users WHERE name = 'Mike' ORDER BY id DESC LIMIT 6;
DELETE FROM table1 WHERE 1; -- 掃描全表,保留 AUTO_INCREMENT 最大值
TRUNCATE TABLE。DELETE。REPLACE(注意多重唯一索引副作用)。INSERT ... VALUES (),(),() 減少網路往返。