CREATE TABLE AS vs SELECT INTO

16

PostgreSQL mendukung CREATE TABLE ASdan SELECT INTOkapan saya menggunakan keduanya?

CREATE TABLE AS - tentukan tabel baru dari hasil kueri

CREATE TABLE ASmembuat tabel dan mengisinya dengan data yang dihitung oleh SELECTperintah. Kolom tabel memiliki nama dan tipe data yang terkait dengan kolom output dari SELECT(kecuali bahwa Anda dapat mengganti nama kolom dengan memberikan daftar eksplisit nama kolom baru).

CREATE TABLE ASmemiliki beberapa kemiripan dengan membuat tampilan, tetapi itu benar-benar sangat berbeda: itu menciptakan tabel baru dan mengevaluasi permintaan sekali saja untuk mengisi tabel baru pada awalnya. Tabel baru tidak akan melacak perubahan selanjutnya ke tabel sumber kueri. Sebaliknya, sebuah pandangan mengevaluasi kembali SELECTpernyataan pendefinisiannya setiap kali ditanya.

Lalu.

SELECT INTO - tentukan tabel baru dari hasil kueri

SELECT INTOmembuat tabel baru dan mengisinya dengan data yang dihitung oleh kueri. Data tidak dikembalikan ke klien, karena dengan normal SELECT. Kolom tabel baru memiliki nama dan tipe data yang terkait dengan kolom output dari SELECT.

Evan Carroll
sumber

Jawaban:

15

Tanpa penjelasan, selalu gunakan CREATE TABLE AStanpa kecuali. Di bagian bawah masing-masing di bawah CATATAN ini dihapus,

Catatan untuk SELECT INTO,

CREATE TABLE ASsecara fungsional mirip dengan SELECT INTO. CREATE TABLE ASadalah sintaks yang disarankan, karena bentuk SELECT INTOini tidak tersedia dalam ECPG atau PL / pgSQL, karena mereka menafsirkan klausa INTO secara berbeda. Selain itu, CREATE TABLE ASmenawarkan superset dari fungsionalitas yang disediakan oleh SELECT INTO.

Catatan untuk CREATE TABLE AS,

Perintah ini secara fungsional mirip dengan SELECT INTO, tetapi lebih disukai karena kecil kemungkinannya akan dikacaukan dengan penggunaan SELECT INTOsintaks lainnya. Selain itu, CREATE TABLE ASmenawarkan superset dari fungsionalitas yang ditawarkan oleh SELECT INTO.

Juga di bagian Kompatibilitas dari dokumen SELECT INTOitu bahkan lebih jauh,

Standar SQL digunakan SELECT INTOuntuk mewakili memilih nilai ke dalam variabel skalar dari program host, daripada membuat tabel baru. Ini memang penggunaan yang ditemukan dalam ECPG (lihat Bab 34) dan PL / pgSQL (lihat Bab 41). Penggunaan PostgreSQL SELECT INTOuntuk mewakili pembuatan tabel adalah historis. Cara terbaik untuk digunakan CREATE TABLE ASuntuk tujuan ini dalam kode baru.

Jadi kita punya,

  1. PostgreSQL menganggapnya membingungkan karena SELECT INTOmelakukan hal-hal lain dalam konteks hanya tersedia di PL / pgSQL, dan ECPG.
  2. CREATE TABLEmendukung lebih banyak fungsi (saya menganggap mereka merujuk WITH OIDS, dan TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO untuk pembuatan tabel "usang".

Sebagai catatan, sintaksis untuk CTAS dengan CTE mungkin terlihat sedikit aneh. , dan SELECT INTO mungkin juga semacam penahanan atas QUELRETRIEVE INTO . QUEL adalah pendahulu untuk SQL, yang digunakan pendahulu untuk PostgreSQL (INGRES).

Evan Carroll
sumber
1

Ada satu hal lain yang saya perhatikan yang hilang dari jawaban yang diterima. Menggunakan CREATE TABLE ASmempertahankan atribut nullable dari setiap kolom yang tampaknya diabaikan oleh SELECT INTO.

Hanya berdasarkan ini saja, saya akan merekomendasikan CREATE TABLE AS. Kasus penggunaan umum untuk kedua pernyataan adalah memuat data dari kueri yang sudah berjalan lama ke dalam tabel tanpa mengunci tabel itu selama durasi kueri Anda. Anda membuat tabel sementara menggunakan salah satu dari perintah di atas, masukkan hasil kueri yang berjalan lama di sana, dan kemudian masukkan hasil tersebut ke dalam tabel asli. Mempertahankan atribut nullable di tabel temp Anda mengurangi kemungkinan gagal memasukkan kedua Anda.

Menguji ini pada PG 11, jadi mungkin fitur yang lebih baru karena pertanyaan ini dijawab.

shrumm
sumber
Permintaan yang berjalan lama tidak mengunci tabel apa pun. Jadi motivasi untuk menggunakan CTAS untuk yang alasannya adalah sia-sia
a_horse_with_no_name