SQL 更新操作包含 INSERT、UPDATE、DELETE,MySQL 另擴充 REPLACE、TRUNCATE TABLE。本文系統整理各語句語法變體、多行插入、衝突處理、型別轉換行為、返回值語義、權限模型等核心知識點。
INSERT — 插入新資料
語法一:標準 VALUES 形式
INSERT INTO tbl (col1, col2, ...) VALUES (val1, val2, ...);
- 欄位清單可省略(需對應所有欄位且順序一致)。
VALUES() 為空 → 所有欄位用預設值。
語法二:SET 形式(MySQL 擴充)
INSERT INTO tbl SET col1=val1, col2=val2, ...;
- 欄位值成對出現,可略過預設值欄位。
- 至少需指定一個欄位。
多行插入(MySQL 擴充,高效能)
INSERT INTO tbl (col1, col2) VALUES (1,'a'), (2,'b'), (3,'c');
- 單條語句插入多行,減少解析/優化/網路往返開銷。
- 每行值必須用括號包裹,逗號分隔。
- 錯誤寫法:
VALUES(1,2,3,4,5) → Column count doesn't match value count。
型別轉換與邊界處理
- 數值超出範圍 → 截斷至邊界值(如 TINYINT 插入 200 → 127)。
- 字串過長 → 截斷(非嚴格模式)或報錯(嚴格模式)。
- NOT NULL 欄位插入 NULL → 用預設值(數值 0、字串空串)。
TIMESTAMP 欄位:其他欄位更新時自動刷新(除非顯式指定)。
REPLACE — 衝突時刪舊插新
REPLACE INTO tbl (col1, col2) VALUES (1, 'new');
- 表必須有 主鍵或唯一索引,且該欄位 NOT NULL,否則退化為 INSERT。
- 衝突行:DELETE 舊行 + INSERT 新行,觸發 DELETE/INSERT 觸發器。
- 返回影響行數:1=純插入,2=1刪+1插,>2=多唯一索引觸發多行刪除。
- 支援
SET 語法與多行 VALUES。
UPDATE — 修改現有資料
UPDATE tbl SET col1=val1, col2=val2 WHERE condition;
- 無
WHERE → 更新全表(極危險)。
- 型別轉換規則同 INSERT。
- 將欄位設為相同值 → 不更新,影響行數不計入。
- 返回值:實際修改行數(非匹配行數)。JDBC/C API 可配置返回匹配行數。
DELETE vs TRUNCATE TABLE
| 特性 | DELETE | TRUNCATE TABLE |
| 條件篩選 | WHERE 支援 | 無,清空全表 |
| 返回行數 | 實際刪除行數 | 永遠 0 |
| 自增計數器 | 保留(除非 WHERE 1 掃描全表) | 重置為 1 |
| 觸發器 | 觸發 DELETE 觸發器 | 不觸發 |
| 速度 | 逐行刪除,較慢 | 釋放數據頁,極快 |
| 回滾 | 支援(事務中) | 不支援(隱含提交) |
ORDER BY/LIMIT | 支援(MySQL 擴充) | 不支援 |
DELETE 進階用法
-- 刪除前 6 筆符合條件記錄
DELETE FROM users WHERE name='Mike' LIMIT 6;
-- 刪除最後 6 筆(按 ID 降序)
DELETE FROM users WHERE name='Mike' ORDER BY id DESC LIMIT 6;
-- 保留自增計數器(掃描全表,慎用大表)
DELETE FROM tbl WHERE 1;
權限模型對照