在專案遷移或架構調整時,常會遇到需要一次修改資料庫中所有資料表前綴的需求。若資料表數量龐大,逐一手動執行 RENAME TABLE 不僅耗時,更極易出錯。本文提供一支完整的 PHP mysqli 腳本,能自動掃描指定資料庫下的所有資料表,並依設定的新舊前綴進行批次重命名,過程中會即時顯示執行結果,方便確認與除錯。
SHOW TABLES 取得所有資料表名稱。RENAME TABLE SQL 指令。<?php
header('Content-Type: text/html; charset=utf-8');
// 資料庫連線設定
$DB_host = 'localhost';
$DB_user = 'root';
$DB_psw = 'root3306';
$DB_database = 'gk_yue39_com';
$DB_charset = 'utf8';
// 舊前綴與新前綴
$dbprefix = 'yue392_com_';
$new_dbprefix = 'yue39_com_';
// 建立 mysqli 連線物件
$db = new mysqli($DB_host, $DB_user, $DB_psw);
// 檢查連線
if (mysqli_connect_errno()) {
printf('Connect failed: %s\n', mysqli_connect_error());
exit();
}
// 選擇資料庫與設定字元集
$db->select_db($DB_database);
$db->set_charset($DB_charset);
// 取得所有資料表
$sql = 'SHOW TABLES';
$result = $db->query($sql);
echo "{$result->num_rows} 筆資料表記錄<br/>";
echo '<table border="1" cellspacing="0" cellpadding="5" align="center" width="90%">';
echo '<tr><th>執行的 SQL</th><th>結果</th></tr>';
// 逐一處理
while ($row = $result->fetch_assoc()) {
// SHOW TABLES 回傳的欄位名稱通常是 Tables_in_{dbname}
foreach ($row as $table_name) {
// 僅處理符合舊前綴的資料表
if (strpos($table_name, $dbprefix) === 0) {
$new_name = str_replace($dbprefix, $new_dbprefix, $table_name);
$rename_sql = "RENAME TABLE `{$table_name}` TO `{$new_name}`";
if ($db->query($rename_sql)) {
echo "<tr><td>{$rename_sql}</td><td><font color='blue'> success</font></td></tr>";
} else {
echo "<tr><td>{$rename_sql}</td><td><font color='red'> failed: {$db->error}</font></td></tr>";
}
} else {
echo "<tr><td>略過: {$table_name} (不符合前綴)</td><td><font color='gray'> skipped</font></td></tr>";
}
}
}
echo '</table>';
$result->free();
$db->close();
?>
ALTER 與 DROP 權限(RENAME TABLE 內部需要)。--dry-run 參數,僅列出將執行的 SQL 不實際執行,供人工核對。sleep() 避免長時間佔用資源導致逾時。掌握這支腳本,未來遇到表前綴調整需求即可輕鬆應對,大幅降低人工操作風險與時間成本。