DROP TABLE 是資料庫中最徹底的銷毀操作——表結構、所有資料、索引、觸發器、權限、分區定義一次性永久消失,無法透過 ROLLBACK 回滾(隱式提交)。本文講解語法、命令列與 PHP 實戰,並建立「刪表前三思」的安全心法。
DROP TABLE [IF EXISTS] table_name [, table_name2 ...];
IF EXISTS:表不存在時不報錯(僅產生 Warning),腳本部署必加。DROP TABLE t1, t2, t3;mysql> USE RUNOOB; mysql> DROP TABLE runoob_tbl; Query OK, 0 rows affected (0.8 sec)
mysql> DROP TABLE IF EXISTS runoob_tbl; -- 表不存在也不報錯 Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> SHOW WARNINGS; +-------+------+----------------------------------+ | Level | Code | Message | +-------+------+----------------------------------+ | Note | 1051 | Unknown table 'runoob_tbl' | +-------+------+----------------------------------+
<?php
$table = 'runoob_tbl'; // 白名單驗證,防注入
$allowed = ['runoob_tbl', 'tcount_tbl', 'employee_tbl'];
if (!in_array($table, $allowed)) die('Invalid table name');
$confirm = $_POST['confirm'] ?? '';
if ($confirm !== 'YES_DROP') {
die('Please confirm by posting confirm=YES_DROP');
}
$conn = new mysqli('localhost:3306', 'root', 'rootpassword', 'RUNOOB');
if ($conn->connect_error) die('Connect failed: ' . $conn->connect_error);
// DDL 不支援預處理,但表名經白名單驗證安全
$sql = "DROP TABLE IF EXISTS `$table`";
if ($conn->query($sql)) {
echo "Table `$table` dropped successfully\n";
} else {
echo "Drop failed: " . $conn->error;
}
$conn->close();
?>
RENAME TABLE runoob_tbl TO runoob_tbl_bak_20240115; 保留結構與資料,觀察一段時間無異常再物理刪除。| 操作 | 保留結構 | 保留資料 | 觸發 Trigger | 重置 AUTO_INCREMENT | 可回滾 | 速度 |
|---|---|---|---|---|---|---|
DROP TABLE | 否 | 否 | 否 | N/A | 否 | 極快 |
TRUNCATE TABLE | 是 | 否 | 否 | 是 | 否 | 極快 |
DELETE FROM | 是 | 是(條件) | 是 | 否 | 是(事務) | 慢 |
Error 1217。ALTER TABLE child DROP FOREIGN KEY fk_name;,或先 DROP 子表。SET FOREIGN_KEY_CHECKS=0; DROP TABLE parent; SET FOREIGN_KEY_CHECKS=1;(極度謹慎,破壞參考完整性)。DROP 權限。DROP TABLE 一行命令,銷毀的是數月甚至數年的資料資產。將「備份驗證、依賴掃描、業務確認、重命名緩衝、變更審批」內化為肌肉記憶,才能在生產環境從容掌控這把雙刃劍。