MySQL 8.4 Release Notes
B.3.6.2 临时表问题
使用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
表来解决这个问题。例如,这个查询失败,并出现Can't reopen table错误:CREATE TEMPORARY TABLE t SELECT 1 AS col_a, 2 AS col_b; SELECT * FROM t AS t1 JOIN t AS t2;
可以使用
WITH
子句定义CTE,而不是TEMPORARY
表:WITH cte AS (SELECT 1 AS col_a, 2 AS col_b) SELECT * FROM cte AS t1 JOIN cte AS t2;
-
出现Can't reopen table错误的原因是引用临时表多次,甚至在不同的存储函数中引用临时表,包括在不同的调用和被调用函数中。
-
如果临时表的名称与现有非临时表相同,非临时表将被隐藏,直到临时表被删除,即使使用不同的存储引擎。
-
使用临时表与复制存在已知问题。请参阅Section 19.5.1.31, “Replication and Temporary Tables”,了解更多信息。