Documentation Home

B.3.6.2 临时表问题

使用 创建的临时表 CREATE TEMPORARY TABLE具有以下限制:

  • TEMPORARY表仅由InnoDBMEMORYMyISAMMERGE 存储引擎支持。

  • NDB Cluster 不支持临时表。

  • 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创建的 a 与现有的非表同名,则在删除表之前TEMPORARY ,该非TEMPORARY表将被隐藏TEMPORARY,即使这些表使用不同的存储引擎也是如此。

  • 将临时表与复制一起使用存在已知问题。有关详细信息,请参阅 第 17.5.1.31 节,“复制和临时表”