在 MySQL 資料庫操作中,暫存表是一項非常實用的功能,它能在當前連線期間儲存中繼運算結果,連線結束時自動銷毀,不會佔用永久儲存空間。本文將詳細說明如何使用 PHP 搭配 MySQL 建立暫存表,並搭配實際程式碼範例幫助您快速上手。
暫存表(Temporary Table)僅在當前資料庫連線(Session)中可見,連線關閉或執行 DROP TEMPORARY TABLE 時自動刪除。它適合用於複雜查詢的中繼結果暫存、大量資料分步處理等場景,能有效降低主表鎖定風險並提升效能。
以下範例展示從連線資料庫、建立暫存表、插入資料到查詢結果的完整流程:
<?php
// 1. 建立資料庫連線
$link = mysql_connect('localhost', 'root', '456789');
if ($link) {
// 2. 選擇資料庫並設定字元集
mysql_select_db('cppc360', $link);
mysql_query("SET NAMES 'gbk'", $link);
echo "資料庫連線成功!<br>";
// 3. 建立暫存表 tmp_query
$temp_sql = "CREATE TEMPORARY TABLE tmp_query (
tmp_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
id INT(11) DEFAULT NULL,
area VARCHAR(20) DEFAULT NULL
)";
$temp_query = mysql_query($temp_sql, $link);
if (!$temp_query) {
die("暫存表建立失敗:" . mysql_error($link));
}
// 4. 從正式表查詢符合條件的資料寫入暫存表
$sql = "INSERT INTO tmp_query (id, area)
SELECT id, area
FROM php168_item_content_1
WHERE content LIKE '%電廠%'
ORDER BY id DESC";
mysql_query($sql, $link);
// 5. 查詢暫存表資料並輸出
$sql = "SELECT * FROM tmp_query";
$query1 = mysql_query($sql, $link);
$total = mysql_num_rows($query1);
echo "共找到 {$total} 筆資料<br>";
while ($rs = mysql_fetch_assoc($query1)) {
echo "ID: {$rs['id']} 區域: {$rs['area']}<br>";
}
// 6. 釋放結果集並關閉連線
mysql_free_result($query1);
mysql_close($link);
} else {
die("資料庫連線失敗:" . mysql_error());
}
?>
使用 CREATE TEMPORARY TABLE 關鍵字,結構定義與一般資料表相同,支援主鍵、索引、自動遞增等屬性。
透過 INSERT INTO ... SELECT ... 語法,可直接將查詢結果寫入暫存表,避免在 PHP 端逐筆處理,大幅提升效能。
mysql_close())自動銷毀DROP TEMPORARY TABLE tmp_query 提前釋放mysql_* 函式已棄用,新專案請使用 mysqli 或 PDO,支援預處理語句,更安全。area)加上索引。CREATE TEMPORARY TABLES 權限。<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=cppc360;charset=gbk", 'root', '456789');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 建立暫存表
$pdo->exec("CREATE TEMPORARY TABLE tmp_query (
tmp_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
id INT(11) DEFAULT NULL,
area VARCHAR(20) DEFAULT NULL
)");
// 寫入資料
$pdo->exec("INSERT INTO tmp_query (id, area)
SELECT id, area
FROM php168_item_content_1
WHERE content LIKE '%電廠%'
ORDER BY id DESC");
// 查詢並輸出
$stmt = $pdo->query("SELECT * FROM tmp_query");
echo "共找到 {$stmt->rowCount()} 筆資料<br>";
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['id']} 區域: {$row['area']}<br>";
}
} catch (PDOException $e) {
die("錯誤:" . $e->getMessage());
}
?>
MySQL 暫存表是處理複雜查詢與大量資料運算的利器,搭配 PHP 可輕鬆實現中繼結果隔離與效能優化。建議新專案採用 PDO 或 mysqli,並善用索引與字元集設定,發揮暫存表最大效益。