临时表问题
创建的临时表CREATE TEMPORARY TABLE
具有以下限制:
TEMPORARY
表只能由支持InnoDB
,MEMORY
,MyISAM
,和MERGE
存储引擎。- NDB群集不支持临时表。
- 该
SHOW TABLES
语句未列出TEMPORARY
表。 要重命名
TEMPORARY
表,RENAME TABLE
将不起作用。使用ALTER TABLE
来代替:ALTER TABLE old_nameRENAME new_name;您不能
TEMPORARY
在同一查询中多次引用一个表。例如对于以下不起作用:SELECT *FROM temp_tableJOIN temp_tableAS t2;该语句产生以下错误:
ERROR 1137: Can't reopen table: 'temp_table'
如果您的查询允许使用公用表表达式(CTE)而不是
TEMPORARY
表,则可以解决此问题。例如,这失败并显示“无法重新打开表”错误:CREATE TEMPORARY TABLE tSELECT 1AS col_a, 2AS col_b;SELECT *FROM tAS t1JOIN tAS t2;为避免该错误,请使用
WITH
定义CTE 的子句,而不要使用TEMPORARY
表:WITH cteAS (SELECT 1AS col_a, 2AS col_b)SELECT *FROM cteAS t1JOIN cteAS t2;- 将不能重新打开表的错误,如果你还下不同的别名存储函数多次引用一个临时表时,即使发生在函数中不同的语句引用。对于在存储函数外部创建并在多个调用和被调用函数中引用的临时表,可能会发生这种情况。
- 如果使用
TEMPORARY
与现有非TEMPORARY
表相同的名称创建a ,则即使表使用不同的存储引擎,也将TEMPORARY
隐藏该非表,直到TEMPORARY
删除该表为止。 - 在复制中使用临时表存在一些已知问题。有关更多信息,请参见“复制功能”。