#### B.3.6.2 临时表问题

[](<>)

创建的临时表[`创建临时表`](create-table.html)有以下限制：

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

-   NDB Cluster 不支持临时表。

-   这[`显示表格`](show-tables.html)声明未列出`暂时的`表。

-   重命名`暂时的`表，`重命名表`不起作用。采用[`更改表`](alter-table.html)反而：

    ```
    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;
    ```

    为避免该错误，请使用[`和`](with.html)定义 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 节，“复制和临时表”](replication-features-temptables.html)， 了解更多信息。
