Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.6.2 临时表问题

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

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

  • 临时表不支持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”,了解更多信息。