首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 批次刪除 MySQL 資料庫所有資料表

     編輯:PHP 綜合知識

PHP 一鍵清空 MySQL 資料庫所有資料表

在開發、測試、重置資料庫時,需要快速刪除所有資料表但保留資料庫本身。本文提供安全、完整的 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('資料庫名稱不符,取消操作');
}
// ... 接著執行刪除邏輯
?>

替代方案:TRUNCATE 而非 DROP

若只想清空資料保留結構:

foreach ($tables as $table) {
    $pdo->exec("TRUNCATE TABLE `$table`");
}
  • TRUNCATE:保留結構、索引、AUTO_INCREMENT 歸零、速度極快、不觸發 TRIGGER
  • DELETE:可帶 WHERE、觸發 TRIGGER、較慢、AUTO_INCREMENT 不歸零
  • DROP:完全移除表結構、需重建

命令列替代方案

若有 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved