MySQL 9.0 发行说明
使用 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;
为避免错误,请使用
WITH
子句定义 CTE,而不是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.32 节,“复制和临时表”。