文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


B.3.6.2 TEMPORARY 表问题

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

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