在開發、測試、重置資料庫時,需要快速刪除所有資料表但保留資料庫本身。本文提供安全、完整的 PHP 實作代碼。
<?php
// 設定資料庫連線參數
$host = 'localhost';
$user = 'db_user';
$password = 'db_pass';
$dbname = 'target_database';
// 建立連線 (建議使用 PDO)
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
// 1. 取得所有資料表名稱
$stmt = $pdo->query("SHOW TABLES");
$tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (empty($tables)) {
echo "資料庫中無任何資料表。";
exit;
}
// 2. 關閉外鍵檢查 (避免刪除順序導致錯誤)
$pdo->exec("SET FOREIGN_KEY_CHECKS = 0");
echo "開始刪除 " . count($tables) " 個資料表...
\n";
// 3. 逐一刪除
foreach ($tables as $table) {
try {
$pdo->exec("DROP TABLE `$table`");
echo "✅ 已刪除: $table
\n";
} catch (PDOException $e) {
echo "❌ 刪除失敗 $table: " . $e->getMessage() . "
\n";
}
}
// 4. 重新開啟外鍵檢查
$pdo->exec("SET FOREIGN_KEY_CHECKS = 1");
echo "
🎉 所有資料表刪除完成!";
?>
| 步驟 | SQL 指令 | 說明 |
|---|---|---|
| 列出資料表 | SHOW TABLES |
回傳單欄位陣列,直接用 FETCH_COLUMN |
| 關閉外鍵 | SET FOREIGN_KEY_CHECKS = 0 |
允許任意順序刪除有關聯的表 |
| 刪除資料表 | DROP TABLE `table_name` |
反引號防保留字衝突 |
| 開啟外鍵 | SET FOREIGN_KEY_CHECKS = 1 |
恢復完整性檢查 |
<?php
// 1. IP 白名單
$allowedIPs = ['127.0.0.1', '192.168.1.100'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) {
http_response_code(403);
die('Forbidden: IP not allowed');
}
// 2. 密碼驗證
$secret = 'super_secret_token_2024';
if (!hash_equals($secret, $_POST['token'] ?? '')) {
die('Invalid token');
}
// 3. 確認機制
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// 顯示確認表單
echo '<form method="post">';
echo '<input type="hidden" name="token" value="' . $secret . '">';
echo '輸入資料庫名稱確認: <input name="confirm_db" required>';
echo '<button type="submit" style="background:red;color:white">確認刪除所有表</button>';
echo '</form>';
exit;
}
if ($_POST['confirm_db'] !== $dbname) {
die('資料庫名稱不符,取消操作');
}
// ... 接著執行刪除邏輯
?>
若只想清空資料保留結構:
foreach ($tables as $table) {
$pdo->exec("TRUNCATE TABLE `$table`");
}
若有 Shell 存取權,單行指令更快:
# 刪除所有表 (保留資料庫)
mysqldump -u$user -p$pass --no-data --add-drop-table $dbname | grep ^DROP | mysql -u$user -p$pass $dbname
# 或使用 MySQL Shell
mysql -u$user -p$pass -e "SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='$dbname'" | mysql -u$user -p$pass $dbname