# B.3.6.2 临时表问题

创建的临时表创建临时表有以下限制:

  • 暂时的表仅由InnoDB,记忆,MyISAM, 和合并存储引擎。

  • NDB Cluster 不支持临时表。

  • 显示表格声明未列出暂时的表。

  • 重命名暂时的表,重命名表不起作用。采用更改表反而:

    ALTER TABLE old_name RENAME new_name;
    
  • 你不能参考暂时的表在同一个查询中不止一次。例如,以下内容不起作用:

    SELECT * FROM temp_table JOIN temp_table AS t2;
    

    该语句产生此错误:

    ERROR 1137: Can't reopen table: 'temp_table'
    

    如果您的查询允许使用公用表表达式 (CTE) 而不是暂时的桌子。例如,这会因无法重新打开表错误而失败:

    CREATE TEMPORARY TABLE t SELECT 1 AS col_a, 2 AS col_b;
    SELECT * FROM t AS t1 JOIN t AS t2;
    

    为避免该错误,请使用定义 CTE 的子句,而不是暂时的桌子:

    WITH cte AS (SELECT 1 AS col_a, 2 AS col_b)
    SELECT * FROM cte AS t1 JOIN cte AS t2;
    
  • 如果您在不同别名下的存储函数中多次引用临时表,即使引用出现在函数内的不同语句中,也会发生无法重新打开表错误。它可能发生在存储函数之外创建并跨多个调用和被调用函数引用的临时表。

  • 如果一个暂时的创建时与现有的非暂时的表,非暂时的表被隐藏,直到暂时的即使表使用不同的存储引擎,表也会被删除。

  • 使用带有复制的临时表存在已知问题。看第 17.5.1.31 节,“复制和临时表”, 了解更多信息。