CREATE TEMPORARY TABLE
で作成される一時テーブルには、次の制限があります:
TEMPORARY
テーブルは、InnoDB
,MEMORY
,MyISAM
およびMERGE
ストレージエンジンでのみサポートされます。NDB Cluster では一時テーブルはサポートされていません。
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'
クエリーで
TEMPORARY
テーブルではなく共通テーブル式 (CTE) の使用が許可されている場合は、この問題を回避できます。 たとえば、これは「テーブルを再オープンできません」エラーで失敗します:CREATE TEMPORARY TABLE t SELECT 1 AS col_a, 2 AS col_b; SELECT * FROM t AS t1 JOIN t AS t2;
エラーを回避するには、
TEMPORARY
テーブルではなく CTE を定義するWITH
句を使用します: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
テーブルが削除されるまで非表示になります。レプリケーションで一時テーブルを使用する場合の既知の問題があります。 詳しくはセクション17.5.1.31「レプリケーションと一時テーブル」,をご覧ください。