UPDATE 核心語法與陷阱
-- 基礎更新
UPDATE tbl SET col1 = val1, col2 = val2 WHERE condition;
-- 多表更新(MySQL 專屬)
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id
SET t1.status = 'done', t2.updated = NOW()
WHERE t1.created < '2023-01-01';
-- 運算式更新
UPDATE account SET balance = balance - 100 WHERE id = 1;
-- 子查詢更新
UPDATE t1 SET col = (SELECT MAX(col) FROM t2 WHERE t2.t1_id = t1.id);
關鍵陷阱
- 缺少 WHERE:全表更新,
UPDATE tbl SET col=val 會鎖全表
- 隱性類型轉換:
WHERE varchar_col = 123 導致全表掃描
- 子查詢效能:相關子查詢逐行執行,改用 JOIN
- 主鍵/唯一索引更新:觸發 DELETE+INSERT,影響 AUTO_INCREMENT、外鍵、觸發器
DELETE 核心語法與陷阱
-- 基礎刪除
DELETE FROM tbl WHERE condition;
-- 多表刪除
DELETE t1 FROM t1 JOIN t2 ON t1.id = t2.t1_id WHERE t2.status = 'deleted';
-- 限制刪除行數
DELETE FROM tbl WHERE status = 'old' ORDER BY created LIMIT 1000;
-- 清空表(高效,重置 AUTO_INCREMENT)
TRUNCATE TABLE tbl;
DELETE vs TRUNCATE
| 特性 | DELETE | TRUNCATE |
| 速度 | 逐行刪除,慢 | 釋放頁,極快 |
| 事務 | 支援 ROLLBACK | 隱性 COMMIT,不可回滾 |
| 觸發器 | 觸發 DELETE 觸發器 | 不觸發 |
| AUTO_INCREMENT | 不重置 | 重置為 1 |
| 外鍵約束 | 檢查 | 若有 FK 引用則失敗 |
| WHERE 支援 | 支援 | 不支援 |
效能優化策略
| 場景 | 優化方案 |
| 大量刪除 (百萬+) | 分批刪除:DELETE ... LIMIT 1000 循環 + 間隔 SLEEP(0.1) |
| 大量更新 | 分批 + 索引覆蓋 + 避免鎖升級 |
| 全表更新/刪除 | 建新表插入保留資料 → RENAME TABLE 切換 |
| 鎖爭用 | SET innodb_lock_wait_timeout=10、按主鍵順序處理 |
| 複製延遲 | 主庫分批、從庫並行重放 |
安全防護清單
- 生產環境禁止無 WHERE 的 UPDATE/DELETE(工具攔截/審計)
- 執行前先 SELECT 驗證影響行數
- 使用只讀帳號日常查詢,寫入帳號單獨管理
- 重要操作截圖/記錄 SQL,備份先行
- 啟用
sql_safe_updates=1 強制要求 WHERE 條件
練習題
- 建立 pet 表(定長 CHAR、ENUM、DATE),匯入資料檔(Windows \r\n)
- 使用 LOAD DATA INFILE 匯入,指定分隔符與 NULL 處理
- mysqlimport 命令列等效寫法
- 設計分批刪除 100 萬筆舊資料腳本,控制鎖與複製延遲
- 上一篇文章: MySQL INSERT/REPLACE/LOAD DATA 資料寫入全方位指南:語法、效能、批次策略與陷阱
- 下一篇文章: MySQL 客戶端連線完整指南:mysql 命令參數、連線協議、選項檔與批次模式
Copyright ©
程式碼之家 All Rights Reserved