Buat tabel sementara dalam pernyataan SELECT tanpa CREATE TABLE yang terpisah

494

Apakah mungkin untuk membuat tabel sementara (hanya sesi) dari pernyataan pilih tanpa menggunakan membuat tabel pernyataan dan menentukan setiap jenis kolom? Saya tahu tabel turunan mampu melakukan ini, tetapi tabel itu super-temporer (hanya pernyataan) dan saya ingin menggunakan kembali.

Ini akan menghemat waktu jika saya tidak harus menulis perintah buat tabel dan menjaga daftar kolom dan daftar jenis dicocokkan.

Bryan Field
sumber

Jawaban:

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

Dari manual yang ditemukan di http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Anda dapat menggunakan kata kunci SEMENTARA saat membuat tabel. Tabel TEMPORARY hanya terlihat oleh sesi saat ini , dan dijatuhkan secara otomatis ketika sesi ditutup. Ini berarti bahwa dua sesi yang berbeda dapat menggunakan nama tabel sementara yang sama tanpa saling bertentangan atau dengan tabel non-TEMPORARY yang ada dengan nama yang sama. (Tabel yang ada disembunyikan sampai tabel sementara dijatuhkan.) Untuk membuat tabel sementara, Anda harus memiliki hak istimewa CREATE TEMPORARY TABLES.

psparrow
sumber
8
Sempurna! Kolom dengan maksimum panjang maksimal dan semuanya! Saya menambahkan kata temporarybegitu create temporary table mytable as select ....
Lapangan Bryan
5
@ imperium2335, Mungkin Anda harus mencoba berikut: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Atau, mungkin Anda dapat mengubah "mesin default tabel baru". Saya membayangkan ini bisa dilakukan dalam variabel tingkat sesi. Lebih baik lagi, gunakan tombol Tanya Pertanyaan di kanan atas.
Lapangan Bryan
10
Tidak perlu mengetahui tentang nama dan tipe kolom, yang merupakan alasan penanya untuk menghindari penggunaan Buat Tabel.
psparrow
30
Anda dapat menggunakannya seperti ini CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1jika Anda tidak ingin menyalin data, hanya struktur
dzona
1
apa yang Anda maksud dengan sesi?
Saurabh Chandra Patel
137

Selain jawaban psparrow jika Anda perlu menambahkan indeks ke tabel sementara Anda lakukan:

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

Ini juga berfungsi dengan baik PRIMARY KEY

RafaSashi
sumber
3
Bisakah Engine = Memori digunakan juga dengan sintaksis seperti itu?
DarkSide
6
@DarkSide Ya ENGINE = MEMORY juga bisa digunakan. Lihat contoh berikut: blog.cnizz.com/2010/11/24/...
RafaSashi
1
apa perbedaan antara MyISAM dan mesin Memori? apa manfaat dari memori?
yeahman
63

Gunakan sintaks ini:

CREATE TEMPORARY TABLE t1 (select * from t2);
Rizon
sumber
1
Itu lebih objektif untuk menyalin data! Bagus!
Rafael Gomes Francisco
54

Engine harus sebelum pilih:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
Tentara Salib
sumber
39

ENGINE=MEMORYtidak didukung ketika tabel berisi BLOB/ TEXTkolom

Cris
sumber
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
pengguna11949964
sumber