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


13.1.20.2 CREATE TEMPORARY TABLE ステートメント

テーブルの作成時に TEMPORARY キーワードを使用できます。 TEMPORARY テーブルは現在のセッション内でのみ表示され、セッションがクローズされると自動的に削除されます。 つまり、2 つの異なるセッションが同じ一時テーブル名を使用することができ、互いに、または同じ名前の既存の TEMPORARY 以外のテーブルと競合することはありません。 (既存のテーブルは、一時テーブルが削除されるまで非表示になります。)

InnoDB では、圧縮一時テーブルはサポートされていません。 innodb_strict_mode が有効な場合 (デフォルト)、ROW_FORMAT=COMPRESSED または KEY_BLOCK_SIZE が指定されていると、CREATE TEMPORARY TABLE はエラーを返します。 innodb_strict_mode が無効な場合は、警告が発行され、圧縮されていない行形式を使用して一時テーブルが作成されます。 innodb_file_per-table オプションは、InnoDB 一時テーブルの作成には影響しません。

CREATE TABLE では、TEMPORARY キーワードとともに使用する場合を除き、暗黙的なコミットが発生します。 セクション13.3.3「暗黙的なコミットを発生させるステートメント」を参照してください。

TEMPORARY テーブルは、データベース (スキーマ) と非常に疎な関係を持っています。 データベースを削除しても、そのデータベース内で作成されたどの TEMPORARY テーブルも自動的には削除されません。

一時テーブルを作成するには、CREATE TEMPORARY TABLES 権限が必要です。 セッションが一時テーブルを作成したあと、サーバーはそのテーブルに対するそれ以上の権限チェックを実行しません。 セッションの作成によって、DROP TABLEINSERTUPDATESELECT などのあらゆる操作をテーブル上で実行できます。

この動作の 1 つの影響として、現在のユーザーが一時テーブルを作成する権限を持たなくても、セッションが一時テーブルを操作できるということがあります。 現在のユーザーには CREATE TEMPORARY TABLES 権限はありませんが、CREATE TEMPORARY TABLES を持ち、一時テーブルを作成するユーザーの権限で実行される定義者コンテキストのストアドプロシージャを実行できるとします。 プロシージャーの実行中、セッションは定義側ユーザーの権限を使用します。 プロシージャーが復帰したあと、有効な権限は現在のユーザーの権限に戻り、これによって引き続き一時テーブルを表示し、一時テーブルに対してあらゆる操作を実行できることになります。

CREATE TEMPORY TABLE ... LIKE を使用して、mysql テーブルスペース、InnoDB システムテーブルスペース (innodb_system) または一般テーブルスペースに存在するテーブルの定義に基づいて空のテーブルを作成することはできません。 このようなテーブルのテーブルスペース定義には、テーブルが存在するテーブルスペースを定義する TABLESPACE 属性が含まれており、前述のテーブルスペースは一時テーブルをサポートしていません。 このようなテーブルの定義に基づいて一時テーブルを作成するには、かわりに次の構文を使用します:

CREATE TEMPORARY TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;
注記

CREATE TEMPORARY TABLE での TABLESPACE = innodb_file_per_table 句および TABLESPACE = innodb_temporary 句のサポートは、MySQL 8.0.13 で非推奨になりました。MySQL の将来のバージョンで削除される予定です。


関連キーワード:  ステートメント, CREATE, テーブル, TABLE, DROP, TEMPORARY, 定義, 作成, サブクエリー, FUNCTION