Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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 表,可以规避该问题。例如,以下操作将失败并出现 无法重新打开表 错误:

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

    要避免该错误,可以使用定义 CTE 的 WITH 子句,而不是 TEMPORARY 表:

    WITH cte AS (SELECT 1 AS col_a, 2 AS col_b)
    SELECT * FROM cte AS t1 JOIN cte AS t2;
  • 如果在存储函数中多次引用临时表,甚至在不同的语句中,即使是不同的别名,也会出现 无法重新打开表 错误。

  • 如果创建了一个与现有非临时表同名的 TEMPORARY 表,那么非临时表将被隐藏,直到 TEMPORARY 表被删除,即使表使用不同的存储引擎。

  • 在复制中使用临时表存在已知问题。请参阅 第 19.5.1.31 节,“复制和临时表”,以获取更多信息。