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 节,“复制和临时表”,以获取更多信息。