MySQL 8.0 リファレンスマニュアル


B.3.6.2 TEMPORARY テーブルに関する問題

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「レプリケーションと一時テーブル」,をご覧ください。


関連キーワード:  テーブル, TEMPORARY, エラー, 一般, TABLE, ステートメント, 方法, サーバー, InnoDB, エンジン