資料操作語言(DML)中的 DELETE 與 UPDATE 是最具破壞力的指令,稍有不慎即可造成全表清空或錯誤資料覆寫。本文以實戰範例示範如何透過 WHERE 子句精準鎖定目標列、SELECT 先行驗證、多欄位同步更新、NULL 值語意處理 等技巧安全執行資料變更,並延伸說明 ALTER TABLE 結構調整與 AUTO_INCREMENT 自動編號機制。
DELETE FROM tbl_name [WHERE condition];
WHERE → 刪除全表所有資料(極度危險)WHERE 僅能引用目標表欄位,無法直接關聯其他表(需用子查詢或多表 DELETE 語法)場景:president 表含 last_name、birth_state 欄位,需刪除「出生於 Ohio」的總統。
-- 步驟 1:先用 SELECT 驗證條件
SELECT * FROM president WHERE birth_state = 'Ohio';
-- 步驟 2:確認無誤後執行刪除
DELETE FROM president WHERE birth_state = 'Ohio';
錯誤嘗試:刪除「Teddy Roosevelt」
DELETE FROM president WHERE last_name = 'Roosevelt';
-- 後果:Franklin Roosevelt 也被誤刪!
正確做法:
-- 先驗證
SELECT * FROM president WHERE last_name = 'Roosevelt' AND first_name = 'Theodore';
-- 或使用主鍵
DELETE FROM president WHERE id = 26; -- 假設 id 為主鍵
SELECT * FROM tbl WHERE condition; 確認目標列SELECT COUNT(*) FROM tbl WHERE condition; 核對筆數CREATE TABLE tbl_backup AS SELECT * FROM tbl WHERE condition;UPDATE tbl_name SET col1=val1, col2=val2... [WHERE condition];
WHERE → 全表所有列更新(同樣危險)-- 為新會員補齊到期日
UPDATE member SET expiration = '2025-12-31' WHERE member_id = 1001;
-- 同時更新 Jerry 的 Email 與通訊地址
UPDATE member
SET email = 'jerry.new@example.com',
address = '123 New Street, Taipei'
WHERE member_id = 1002;
-- Jerry 升級為終身會員,到期日設為 NULL
UPDATE member SET expiration = NULL WHERE member_id = 1002;
注意:欄位必須允許 NULL(無 NOT NULL 限制),且業務邏輯需明確定義 NULL 代表「永久/不限制」而非「未知」。
-- 所有分數低於 60 的學生加 5 分
UPDATE score SET points = points + 5 WHERE points < 60;
SELECT * FROM tbl WHERE condition; 確認目標SET 子句每個欄位的目標值型別與範圍LIMIT 分批(MySQL 支援 UPDATE ... LIMIT N)binlog_format=ROW 便於事後追蹤member 表缺少會員編號,需新增 member_id 作為主鍵並自動編號。
ALTER TABLE member
ADD member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
INT UNSIGNED:非負整數,擴大正向範圍NOT NULL:主鍵不得為空AUTO_INCREMENT:MySQL 自動分配遞增序號PRIMARY KEY:直接設為主鍵(隱含 UNIQUE 與 NOT NULL)FIRST:置於表第一欄(可選,視習慣)SELECT member_id, last_name, first_name FROM member;
-- 既有資料自動獲得 1,2,3... 序號
-- 新 INSERT 不指定 member_id 將自動取得下一序號
| 約束 | 說明 |
|---|---|
| 資料型別 | 僅限整數型別 |
| 索引要求 | 必須建立索引(通常為 PRIMARY KEY 或 UNIQUE) |
| NULL 限制 | MySQL 5.0+ 允許 NULL,但強烈建議 NOT NULL |
| 正向性 | 建議加 UNSIGNED,避免負數浪費範圍 |
| 單表唯一 | 每張表僅能有一個 AUTO_INCREMENT 欄位 |
若誤執行 DELETE/UPDATE:
mysqldump 還原或 mysqlbinlog 時間點復原(PITR)innodb_undo_log、FLASHBACK 工具(實驗性)DELETE 與 UPDATE 的核心心法是 「先 SELECT 後執行,寧慢勿錯」。配合 WHERE 精準鎖定、LIMIT 限制影響範圍、BACKUP 表備份、binlog 完整記錄,可將誤操作風險降至最低。結構變更時善用 AUTO_INCREMENT 自動維護唯一識別碼,搭配 UNSIGNED NOT NULL PRIMARY KEY 完整約束,打造健壯的資料模型基石。