首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UPDATE/DELETE 資料修改刪除實戰:語法、條件構建、效能優化與安全防護

     編輯:MySQL 資料庫相關知識

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

效能優化策略

特性DELETETRUNCATE
速度逐行刪除,慢釋放頁,極快
事務支援 ROLLBACK隱性 COMMIT,不可回滾
觸發器觸發 DELETE 觸發器不觸發
AUTO_INCREMENT不重置重置為 1
外鍵約束檢查若有 FK 引用則失敗
WHERE 支援支援不支援

安全防護清單

  1. 生產環境禁止無 WHERE 的 UPDATE/DELETE(工具攔截/審計)
  2. 執行前先 SELECT 驗證影響行數
  3. 使用只讀帳號日常查詢,寫入帳號單獨管理
  4. 重要操作截圖/記錄 SQL,備份先行
  5. 啟用 sql_safe_updates=1 強制要求 WHERE 條件

練習題

  1. 建立 pet 表(定長 CHAR、ENUM、DATE),匯入資料檔(Windows \r\n)
  2. 使用 LOAD DATA INFILE 匯入,指定分隔符與 NULL 處理
  3. mysqlimport 命令列等效寫法
  4. 設計分批刪除 100 萬筆舊資料腳本,控制鎖與複製延遲
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景優化方案
大量刪除 (百萬+)分批刪除:DELETE ... LIMIT 1000 循環 + 間隔 SLEEP(0.1)
大量更新分批 + 索引覆蓋 + 避免鎖升級
全表更新/刪除建新表插入保留資料 → RENAME TABLE 切換
鎖爭用SET innodb_lock_wait_timeout=10、按主鍵順序處理
複製延遲主庫分批、從庫並行重放