MySQL 8.4 版本注意事項
使用 CREATE TEMPORARY TABLE
建立的暫存資料表有下列限制
TEMPORARY
資料表僅由InnoDB
、MEMORY
、MyISAM
和MERGE
儲存引擎支援。NDB 叢集不支援暫存資料表。
SHOW TABLES
陳述式不會列出TEMPORARY
資料表。若要重新命名
TEMPORARY
資料表,RENAME TABLE
無效。請改用ALTER TABLE
ALTER TABLE old_name RENAME new_name;
您無法在同一個查詢中多次參照
TEMPORARY
資料表。例如,下列程式碼將無法運作SELECT * FROM temp_table JOIN temp_table AS t2;
此陳述式會產生此錯誤
ERROR 1137: Can't reopen table: 'temp_table'
如果您的查詢允許使用通用資料表運算式 (CTE) 而非
TEMPORARY
資料表,您可以解決此問題。例如,這個程式碼會因為 無法重新開啟資料表 錯誤而失敗CREATE TEMPORARY TABLE t SELECT 1 AS col_a, 2 AS col_b; SELECT * FROM t AS t1 JOIN t AS t2;
若要避免此錯誤,請使用定義 CTE 的
WITH
子句,而不是TEMPORARY
資料表WITH cte AS (SELECT 1 AS col_a, 2 AS col_b) SELECT * FROM cte AS t1 JOIN cte AS t2;
如果您在儲存函數中以不同別名多次參照暫存資料表,即使參照發生在函數內的不同陳述式中,也會發生 無法重新開啟資料表 錯誤。對於在儲存函數外部建立並在多個呼叫和被呼叫函數中參照的暫存資料表,可能會發生這種情況。
如果
TEMPORARY
是以與現有的非TEMPORARY
資料表相同的名稱建立的,則非TEMPORARY
資料表會隱藏起來,直到TEMPORARY
資料表被捨棄為止,即使資料表使用不同的儲存引擎也是如此。在使用複製時,暫存資料表存在已知問題。如需詳細資訊,請參閱 第 19.5.1.31 節「複製和暫存資料表」。