資料操作語言 (DML) 是與資料庫交互的核心。本文系統整理 INSERT、REPLACE、DELETE、UPDATE 四大指令的完整語法、多種寫法、實戰範例與避坑指南,適合入門速查與進階複習。
-- 1. 標準 VALUES 寫法 (單行/多行)
INSERT INTO tbl (col1, col2) VALUES (val1, val2);
INSERT INTO tbl (col1, col2) VALUES (v1, v2), (v3, v4), (v5, v6); -- 批次插入,效能最佳
-- 2. SET 寫法 (單行,欄位順序不固定)
INSERT INTO tbl SET col1 = val1, col2 = val2;
-- 3. SELECT 衍生插入 (查詢結果直接寫入)
INSERT INTO tbl (col1, col2) SELECT col_a, col_b FROM other_tbl WHERE condition;
-- 4. 忽略重複鍵錯誤
INSERT IGNORE INTO tbl (col1, col2) VALUES (val1, val2); -- 重複主鍵/唯一鍵靜默跳過
| 型別 | 字面值格式 | 範例 |
|---|---|---|
| 字串 | 單引號包裹 | 'text', 'O''Reilly' (轉義) |
| 數值 | 直接寫入 | 123, -45.67 |
| 日期時間 | 字串格式 | '2024-01-15', '2024-01-15 14:30:00' |
| NULL | 關鍵字 | NULL (非 '' 或 0) |
-- 批次插入 (高效)
INSERT INTO tutors (Tname, Gender, Age) VALUES
('Sam', 'M', 28),
('Barlow', 'M', 27);
-- SET 寫法
INSERT INTO tutors SET Tname='Winne', Gender='F', Age=25;
-- 衍生插入 (年齡 > 20 的學生轉為導師)
INSERT INTO tutors (Tname, Gender, Age)
SELECT Name, Gender, Age FROM students WHERE Age > 20;
邏輯:嘗試插入 → 若違反主鍵/唯一鍵 → 刪除舊行 → 插入新行。本質是 DELETE + INSERT,會觸發 ON DELETE 觸發器、自增 ID 變更。
REPLACE INTO tbl (col1, col2) VALUES (val1, val2);
REPLACE INTO tbl SET col1 = val1, col2 = val2;
REPLACE INTO tbl (col1, col2) SELECT col_a, col_b FROM other_tbl;
INSERT ... ON DUPLICATE KEY UPDATE (見下)
DELETE FROM tbl WHERE condition;
DELETE FROM tbl WHERE condition LIMIT 1; -- 僅刪 1 行
DELETE FROM tbl; -- 清空表 (不重置自增)
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 速度 | 逐行刪除,慢 | 釋放頁面,極快 |
| 自增計數器 | 保留 | 重置為 0/1 |
| 觸發器 | 觸發 ON DELETE | 不觸發 |
| 回滾 | 支援 (事務內) | 不支援 (隱式提交) |
| WHERE | 支援 | 不支援 |
TRUNCATE TABLE tbl;
UPDATE tbl SET col1 = val1, col2 = val2 WHERE condition;
UPDATE tbl SET col1 = val1 WHERE condition LIMIT 1; -- 僅更新 1 行
-- JOIN 更新
UPDATE tbl_a a JOIN tbl_b b ON a.id = b.id SET a.age = b.age;
-- 子查詢更新
UPDATE tbl_a SET age = (SELECT age FROM tbl_b WHERE id = tbl_a.id);
-- 修正寵物性別
UPDATE pet SET sex = 'f' WHERE name = 'Whistler';
-- 學生年齡修正
UPDATE students SET Age = 20 WHERE Name = 'Xuzhu';
| 語句 | 行為 | 自增 ID | 觸發器 | 適用場景 |
|---|---|---|---|---|
INSERT ... ON DUPLICATE KEY UPDATE | 衝突時更新指定欄位 | 保留 | 觸發 INSERT/UPDATE | 計數器、統計表、部分欄位更新 |
REPLACE INTO | 衝突時刪除舊行插入新行 | 改變 (重新分配) | 觸發 DELETE/INSERT | 全行替換、不介意 ID 變更 |
INSERT IGNORE | 衝突時靜默跳過 | 保留 (但可能跳號) | 不觸發 | 去重導入、不需更新 |
INSERT INTO stats (date, pv, uv) VALUES ('2024-01-15', 100, 50)
ON DUPLICATE KEY UPDATE
pv = pv + VALUES(pv),
uv = uv + VALUES(uv),
updated_at = NOW();
NULL、0 或省略該欄位,絕不傳空字串 '' (嚴格模式報錯)。UPDATE/DELETE 沒 WHERE = 全表操作,**生產環境嚴禁** 直接執行無條件 DML。熟練掌握四大 DML 的語法變體、效能特性與適用邊界,是資料庫開發者處理業務邏輯的基本功。