MySQL 8.3 Release Notes
使用 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
表被删除,即使表使用不同的存储引擎。 -
在复制中使用临时表存在已知问题。请参阅 第 19.5.1.31 节,“复制和临时表”,以获取更多信息。