SHOW TABLES 不會列出臨時表。CREATE TEMPORARY TABLES 權限(默認授予)。-- 1. 創建臨時表
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
) ENGINE=InnoDB; -- 5.6+ 支持 InnoDB 臨時表,支持事務
-- 2. 插入數據
INSERT INTO SalesSummary (product_name, total_sales, avg_unit_price, total_units_sold)
VALUES ('cucumber', 100.25, 90, 2);
-- 3. 查詢
SELECT * FROM SalesSummary;
-- +--------------+-------------+----------------+------------------+
-- | product_name | total_sales | avg_unit_price | total_units_sold |
-- +--------------+-------------+----------------+------------------+
-- | cucumber | 100.25 | 90.00 | 2 |
-- +--------------+-------------+----------------+------------------+
-- 4. 手動刪除(可選)
DROP TEMPORARY TABLE SalesSummary;
-- 再次查詢報錯:Table 'test.SalesSummary' doesn't exist
-- 步驟 1:提取基礎數據到臨時表 CREATE TEMPORARY TABLE tmp_daily_sales AS SELECT date, product_id, SUM(amount) AS total FROM orders WHERE date >= '2024-01-01' GROUP BY date, product_id; -- 步驟 2:多維度聚合複用臨時表 SELECT product_id, SUM(total) AS month_total FROM tmp_daily_sales GROUP BY product_id; SELECT date, SUM(total) AS day_total FROM tmp_daily_sales GROUP BY date; -- 步驟 3:腳本結束自動銷毀,無殘留
-- 將深分頁的主鍵集合存入臨時表,後續多次 JOIN 復用 CREATE TEMPORARY TABLE tmp_page_ids (id INT PRIMARY KEY); INSERT INTO tmp_page_ids SELECT id FROM big_table WHERE status=1 ORDER BY id LIMIT 100000, 20; SELECT b.* FROM big_table b JOIN tmp_page_ids t USING (id); -- 避免重複執行深分頁子查詢
CREATE PROCEDURE sp_calc() BEGIN CREATE TEMPORARY TABLE tmp_stats (metric VARCHAR(20), val BIGINT); INSERT INTO tmp_stats SELECT 'total_users', COUNT(*) FROM users; INSERT INTO tmp_stats SELECT 'active_users', COUNT(*) FROM users WHERE last_login > DATE_SUB(NOW(), INTERVAL 7 DAY); SELECT * FROM tmp_stats; -- 臨時表隨存儲過程結束自動銷毀 END
| 限制 | 說明 | 規避方案 |
|---|---|---|
| 同一會話不可重複創建同名臨時表 | 第二次 CREATE 會報錯 | 先 DROP TEMPORARY TABLE IF EXISTS 或用唯一名稱 |
| 不支持外鍵約束 | 臨時表不支持 FOREIGN KEY | 應用層保證完整性 |
複製表結構 CREATE TEMPORARY TABLE ... LIKE 不複製數據 | 需再 INSERT SELECT | 用 CREATE TEMPORARY TABLE ... AS SELECT 一步到位 |
| 主從同步風險 | 基於 STATEMENT 格式時,從庫可能不創建臨時表導致後續 SQL 報錯 | Binlog 格式設為 ROW / MIXED,或避免在關鍵同步鏈路使用 |
| 連接池復用導致「殘留」 | 長連接池不斷開,臨時表不會自動清理 | 獲取連接後立即 DROP TEMPORARY TABLE IF EXISTS xxx,或使用唯一前綴名 |
MySQL 臨時表是**會話級私有工作區**,適合複雜查詢中間結果緩存、報表多階段聚合、存儲過程變量替代。**核心優勢:自動清理、隔離性強、無鎖表風險**。生產使用需注意連接池復用導致的生命周期異常,建議統一命名規範 tmp_{module}_{random} 並獲連即清理。