個別のCREATE TABLEを使用せずにSELECTステートメントで一時テーブルを作成する


494

create tableステートメントを使用せずに各列タイプを指定せずに、selectステートメントから一時(セッションのみ)テーブルを作成することはできますか?派生テーブルでこれが可能であることは知っていますが、それらはスーパーテンポラリー(ステートメントのみ)であり、再利用したいと考えています。

create tableコマンドを作成して列リストとタイプリストを一致させる必要がない場合は、時間を節約できます。

回答:


789
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

http://dev.mysql.com/doc/refman/5.7/en/create-table.htmlにあるマニュアルから

テーブルを作成するときにTEMPORARYキーワードを使用できます。TEMPORARYテーブルは現在のセッションのみ表示され、セッションが閉じられると自動的削除されます。これは、2つの異なるセッションが互いに、または同じ名前の既存の非TEMPORARYテーブルと競合することなく、同じ一時テーブル名を使用できることを意味します。(既存のテーブルは、一時テーブルが削除されるまで非表示になります。)一時テーブルを作成するには、CREATE TEMPORARY TABLES特権が必要です。


8
パーフェクト!最適な最大長のカラムなどすべてを備えたカラム!私は言葉を追加しましたtemporaryのでcreate temporary table mytable as select ...
ブライアンフィールド、

5
@ imperium2335、おそらく以下を試してみてください: create table t as select ... limit 0; alter table t engine=memory; insert into t select ...。または、「新しいテーブルのデフォルトエンジン」を変更することもできます。これはセッションレベルの変数で実行できると思います。さらに、右上の[質問する]ボタンを使用してください。
ブライアンフィールド

10
列の名前と型について知っている必要はありません。これが、質問者がCreate Tableの使用を避けたい理由でした。
psparrow 2013

30
CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1データをコピーしたくない場合は、構造だけでこのように使用できます
dzona '22

1
セッションとはどういう意味ですか?
Saurabh Chandra Patel 2016

137

一時テーブルにインデックス追加する必要がある場合は、psparrowの回答に加えて、次の操作を行います。

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

また、 PRIMARY KEY


3
Engine = Memoryもそのような構文で使用できますか?
DarkSide 2013年

6
@DarkSideはいENGINE = MEMORYも使用できます。次の例を参照してくださいblog.cnizz.com/2010/11/24/...
RafaSashi

1
MyISAMとメモリエンジンの違いは何ですか?メモリの利点は何ですか?
イェーマン


54

エンジンは選択前にある必要があります:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)

39

ENGINE=MEMORYテーブルにBLOB/ TEXT列が含まれている場合はサポートされません


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.