DELETE FROM 是資料庫中最具破壞力的指令之一——執行後資料永久消失,無法復原(除非有備份或 Binlog)。本文系統講解語法、條件控制、命令列與 PHP 實戰,並強調防誤刪的關鍵習慣。
DELETE FROM table_name [WHERE condition];
mysql> DELETE FROM runoob_tbl WHERE runoob_id = 3; Query OK, 1 row affected (0.23 sec)
mysql> DELETE FROM runoob_tbl WHERE submission_date < '2007-05-01'; Query OK, 2 rows affected (0.15 sec)
mysql> DELETE FROM runoob_tbl; -- 刪除所有 3 行資料 Query OK, 3 rows affected (0.05 sec)
<?php
$id = (int)($_POST['id'] ?? 0); // 強制轉整數,防注入
if ($id <= 0) die('Invalid ID');
$sql = 'DELETE FROM runoob_tbl WHERE runoob_id = ?';
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 'i', $id);
mysqli_stmt_execute($stmt);
if (mysqli_stmt_affected_rows($stmt) > 0) {
echo "Deleted successfully\n";
} else {
echo "No matching record found\n";
}
mysqli_stmt_close($stmt);
?>
SELECT * FROM table WHERE ... 確認將刪除的資料範圍。START TRANSACTION; DELETE ...; -- 確認無誤 COMMIT; -- 或 ROLLBACK;deleted_at DATETIME NULL 或 is_deleted TINYINT DEFAULT 0 欄位,邏輯上標記刪除,物理保留資料,支援撤銷與稽核。| 操作 | 速度 | 可回滾 | 觸發 Trigger | 重置 AUTO_INCREMENT | 適用場景 |
|---|---|---|---|---|---|
DELETE | 慢(逐行) | 是(事務) | 是 | 否 | 條件刪除、需觸發器、小批量 |
TRUNCATE | 極快(重建表) | 否 | 否 | 是 | 清空全表、重置自增 ID、測試環境 |
DROP TABLE | 極快 | 否 | 否 | N/A | 永久移除表結構與資料 |
Error 1175: Safe update mode:Workbench 安全模式禁止無主鍵條件的 UPDATE/DELETE。解決:SET SQL_SAFE_UPDATES=0; 或加主鍵條件。Foreign key constraint fails:被父表引用的行無法直接刪除。解決:先刪子表關聯行、或設定 ON DELETE CASCADE、或暫停外鍵檢查 SET FOREIGN_KEY_CHECKS=0;(謹慎)。DELETE 雖簡單,卻關係資料生死。養成「先查後刪、事務包裹、軟刪優先」的肌肉記憶,才能在生產環境游刃有餘、萬無一失。