核心特性
- 僅在當前會話可見,會話結束自動銷毀
- 不同會話可創建同名臨時表,互不干擾
- MySQL 3.23+ 支持,更早版本用 HEAP 表替代
SHOW TABLES 不顯示臨時表
創建與使用
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL,
total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO SalesSummary (product_name, total_sales, avg_unit_price, total_units_sold)
VALUES ('cucumber', 100.25, 90, 2);
SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
手動刪除
DROP TABLE SalesSummary;
SELECT * FROM SalesSummary; -- ERROR 1146: Table doesn't exist
PHP 中的生命週期
<?php
$mysqli = new mysqli('localhost', 'root', 'rootpassword', 'TUTORIALS', 3306);
// 腳本執行期間 = 一個會話
$mysqli->query("CREATE TEMPORARY TABLE tmp_session (id INT, data VARCHAR(100))");
$mysqli->query("INSERT INTO tmp_session VALUES (1, 'request data')");
// ... 業務邏輯 ...
// 腳本結束,連接關閉,臨時表自動銷毀
$mysqli->close();
?>
應用場景
- 複雜報表中間結果:多步聚合、轉換,避免污染正式表。
- 大數據分頁優化:將篩選後的 ID 存入臨時表,再 JOIN 查詳情。
- 跨庫/跨服務器數據對賬:拉取遠端數據入臨時表,本地 JOIN 比對。
注意事項
- 臨時表不支持外鍵、觸發器、分區
- 事務回滾不會回滾臨時表的 DDL(創建/刪除),但會回滾 DML
- 複製表結構:
CREATE TEMPORARY TABLE tmp LIKE real_table