Mulai Hologres V1.3.21, Anda dapat menggunakan pernyataan CREATE TABLE AS untuk membuat tabel baru dengan menyalin struktur dari tabel sumber. Anda juga dapat memilih untuk menyinkronkan data dari tabel sumber. Topik ini menjelaskan cara menggunakan pernyataan CREATE TABLE AS di Hologres.
Informasi latar belakang
Pernyataan CREATE TABLE AS digunakan untuk membuat tabel baru dengan struktur yang sama seperti tabel sumber atau hasil kueri SELECT tertentu. Anda dapat memilih untuk menyinkronkan data secara otomatis dari tabel sumber ke tabel baru. Namun, pernyataan ini tidak menyalin properti tabel.
Tabel berikut menunjukkan perbedaan sintaksis antara CREATE TABLE AS dan CREATE TABLE LIKE. Pilih pernyataan yang sesuai berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut tentang CREATE TABLE LIKE, lihat CREATE TABLE LIKE.
Metode Penagihan | CREATE TABLE AS | CREATE TABLE LIKE (fungsi) |
Menyalin struktur tabel (skema dan tipe data) | Didukung. | Didukung. |
Menyalin properti tabel (nullabilitas, nilai default, indeks, kunci utama, atau komentar) | Tidak didukung. | Dukungan terbatas. |
Menyalin data tabel sumber | Didukung. | Tidak didukung. |
Menyalin tabel sumber dan mengizinkan pengguna untuk mengonfigurasi properti tabel baru seperti kunci utama dan indeks secara manual | Dukungan terbatas. Kunci utama tidak dapat dikonfigurasi secara manual. | Dukungan terbatas. Kunci utama tidak dapat dikonfigurasi secara manual. |
Membuat tabel non-partisi dengan menyalin struktur tabel partisi | Didukung. | Didukung. |
Membuat tabel partisi | Tidak didukung. | Dukungan terbatas. Anda dapat membuat tabel partisi secara manual menggunakan |
Batasan
Hanya Hologres V1.3.21 dan versi lebih baru yang mendukung pernyataan
CREATE TABLE AS.CatatanJika versi instance Hologres Anda lebih lama dari V1.3.21, tingkatkan instance Hologres Anda secara manual di konsol Hologres atau bergabunglah dengan grup DingTalk Hologres untuk mengajukan peningkatan instance. Untuk informasi lebih lanjut tentang cara meningkatkan instance Hologres secara manual, lihat Peningkatan Instance. Untuk informasi lebih lanjut tentang cara bergabung dengan grup DingTalk Hologres, lihat Dapatkan dukungan online untuk Hologres.
Anda dapat menggunakan pernyataan
CREATE TABLE ASuntuk menyalin hanya struktur tabel, tetapi tidak properti tabel seperti kunci utama dan indeks.Saat membuat tabel, pernyataan
CREATE TABLE ASmemungkinkan Anda untuk menyinkronkan data dari tabel sumber ke tabel baru secara otomatis, namun atomicitas impor data tidak dapat dijamin.Jika tabel sumber berisi kolom dengan tipe data tanpa presisi, seperti VARCHAR, BPCHAR, NUMERIC (DECIMAL), BIT, atau VARBIT, Anda harus menentukan presisi eksplisit untuk kolom-kolom tersebut dalam pernyataan
CREATE TABLE AS. Jika tidak, pesan kesalahan akan dikembalikan.Jika tabel sumber berisi kolom dengan tipe INTERVAL, TIME, TIMETZ, TIMESTAMP, atau TIMESTAMPTZ, Anda tidak dapat menentukan presisi untuk kolom-kolom tersebut dalam pernyataan
CREATE TABLE AS. Jika tidak, pesan kesalahan akan dikembalikan.Anda dapat menggunakan pernyataan
CREATE TABLE ASuntuk membuat tabel non-partisi dari tabel induk atau tabel anak. Anda dapat menyalin hanya struktur tabel dan menyinkronkan data. Saat menyalin tabel induk, pernyataan ini secara otomatis menyinkronkan data dari semua tabel anaknya. Anda tidak dapat membuat tabel partisi dengan menyalin struktur partisi seperti batasan kunci partisi dan hubungan warisan.Mulai Hologres V3.0.9, sumber daya komputasi serverless dapat digunakan untuk menjalankan pernyataan CREATE TABLE AS. Untuk informasi lebih lanjut tentang sumber daya komputasi serverless, lihat Panduan Pengguna pada Komputasi Serverless.
Sebelum Hologres V3.0.9, pernyataan CREATE TABLE AS menghasilkan satu catatan di gudang metadata (hologres.hg_query_log) yang menjelaskan pernyataan itu sendiri. Mulai Hologres V3.0.9, pernyataan ini menghasilkan dua catatan. Satu catatan menjelaskan pernyataan CREATE TABLE AS, dan catatan lainnya menjelaskan pernyataan INSERT yang dihasilkan selama eksekusi. Kedua catatan tersebut dihubungkan oleh ID transaksi. Contoh:
SELECT query_id, query, extended_info FROM hologres.hg_query_log WHERE extended_info ->> 'source_trx' = '<transaction_id>' -- ID transaksi dapat diperoleh melalui bidang trans_id yang dicatat oleh pernyataan CREATE TABLE AS. ORDER BY query_start ;
Sintaksis
Pernyataan CREATE TABLE AS menggunakan sintaksis berikut untuk membuat tabel di Hologres:
-- Buat tabel dengan menyalin tabel sumber.
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS TABLE <src_table_name> [ WITH [ NO ] DATA ]
-- Buat tabel dengan menyalin hasil kueri SELECT.
CREATE TABLE [ IF NOT EXISTS ] <new_table_name> AS <select_query> [ WITH [ NO ] DATA ]Parameter
Parameter | Deskripsi |
new_table_name | Nama tabel yang akan dibuat. Anda harus menetapkan parameter ini sebagai string tetap, bukan string variabel atau fungsi yang digunakan untuk menghasilkan nama tabel. Anda tidak dapat membuat tabel asing dengan menjalankan pernyataan CREATE TABLE AS. |
[ IF NOT EXISTS ] | Memeriksa apakah tabel dengan nama yang sama sudah ada. Jika tabel dengan nama yang sama sudah ada, langkah pembuatan tabel dilewati. |
src_table_name | Nama tabel sumber atau Tampilan yang ingin Anda salin. Catatan Hologres V2.1.21 dan versi lebih baru memungkinkan Anda menggunakan Tampilan sebagai sumber data. Anda dapat membuat tabel dengan menyalin skema dan data dari Tampilan. |
select_query | Pernyataan SQL yang digunakan untuk mengkueri data. Untuk informasi lebih lanjut, lihat SELECT. |
[ WITH [ NO ] DATA ] | Menentukan apakah akan secara otomatis menyinkronkan data dari tabel sumber ke tabel yang ingin Anda buat. Nilai valid:
Jika Anda tidak menentukan parameter ini, nilai default |
Contoh
Buat tabel non-partisi dari tabel sumber non-partisi.
Dalam contoh ini, tabel sumber dibuat dan data dimasukkan ke dalam tabel dengan menjalankan pernyataan berikut:
BEGIN; CREATE TABLE public.src_table ( "a" int8 NOT NULL, "b" text NOT NULL, PRIMARY KEY (a) ); CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column'); CALL SET_TABLE_PROPERTY('public.src_table', 'bitmap_columns', 'b'); CALL SET_TABLE_PROPERTY('public.src_table', 'dictionary_encoding_columns', 'b:auto'); CALL SET_TABLE_PROPERTY('public.src_table', 'time_to_live_in_seconds', '3153600000'); CALL SET_TABLE_PROPERTY('public.src_table', 'distribution_key', 'a'); CALL SET_TABLE_PROPERTY('public.src_table', 'storage_format', 'segment'); COMMIT; INSERT INTO public.src_table VALUES (1,'qaz'),(2,'wsx');Skenario 1: Buat tabel dari tabel sumber dengan data disinkronkan secara otomatis dari tabel sumber.
CREATE TABLE public.new_table AS TABLE public.src_table;Kueri data dari tabel baru.
SELECT * FROM public.new_table; ------- a | b --|----- 1 | qaz 2 | wsxKueri pernyataan bahasa definisi data (DDL) dari tabel baru. Pernyataan DDL menunjukkan bahwa tabel baru tidak mewarisi kunci utama dan properti NOT NULL dari tabel sumber.
-- Pernyataan DDL dari tabel baru: select hg_dump_script('public.new_table'); ------------------------------------------- BEGIN; CREATE TABLE public.new_table ( a int, b text ); CALL set_table_property('public.new_table', 'orientation', 'column'); CALL set_table_property('public.new_table', 'storage_format', 'orc'); CALL set_table_property('public.new_table', 'bitmap_columns', 'b'); CALL set_table_property('public.new_table', 'dictionary_encoding_columns', 'b:auto'); CALL set_table_property('public.new_table', 'time_to_live_in_seconds', '3153600000'); COMMENT ON TABLE public.new_table IS NULL; END;Skenario 2: Buat tabel dari tabel sumber dengan data disinkronkan secara otomatis dari tabel sumber. Jika tabel dengan nama yang sama sudah ada, langkah pembuatan tabel dilewati dan data di tabel sumber tidak disinkronkan.
CREATE TABLE IF NOT EXISTS public.new_table AS TABLE public.src_table; NOTICE: relation "new_table" already exists, skippingSkenario 3: Buat tabel dengan menyalin hanya struktur tabel sumber. Data dari tabel sumber tidak disinkronkan ke tabel baru.
CREATE TABLE public.new_table AS TABLE public.src_table WITH NO DATA;Skenario 4: Buat tabel dengan menyalin hasil dari kueri
SELECTdan sinkronkan data secara otomatis.CREATE TABLE public.new_table_2 AS SELECT * FROM public.src_table WHERE a = 1 ;
Buat tabel non-partisi dari tabel partisi atau partisi dari tabel partisi. Anda hanya dapat membuat tabel non-partisi dari tabel partisi.
Dalam contoh ini, tabel partisi dan beberapa partisi dari tabel partisi dibuat, dan data dimasukkan ke dalam partisi dengan menjalankan pernyataan berikut:
BEGIN; CREATE TABLE public.src_table_partitioned ( "a" int NOT NULL, "b" text , PRIMARY KEY (a) ) PARTITION BY LIST(a); CREATE TABLE public.src_table_child1 PARTITION OF public.src_table_partitioned FOR VALUES IN (1); CREATE TABLE public.src_table_child2 PARTITION OF public.src_table_partitioned FOR VALUES IN (2); CREATE TABLE public.src_table_child3 PARTITION OF public.src_table_partitioned FOR VALUES IN (3); COMMIT; INSERT INTO src_table_child1 VALUES (1,'aaa'); INSERT INTO src_table_child2 VALUES (2,'bbb'); INSERT INTO src_table_child3 VALUES (3,'ccc');Skenario 1: Buat tabel non-partisi dari tabel partisi dengan data di semua partisi disinkronkan.
CREATE TABLE public.new_table_2 AS TABLE public.src_table_partitioned;Kueri data dari tabel baru. Hasilnya menunjukkan bahwa tabel baru berisi data di semua partisi dari tabel sumber dan tabel baru adalah tabel non-partisi.
SELECT * FROM public.new_table_2; ---------------------------------- a | b --|----- 2 | bbb 1 | aaa 3 | cccSkenario 2: Buat tabel non-partisi dari partisi dengan data di partisi disinkronkan.
-- Buat tabel dari partisi tabel partisi dengan data di partisi disinkronkan secara otomatis. Pernyataan ini hanya menyinkronkan data dari partisi yang ditentukan. CREATE TABLE public.new_table_3 AS TABLE public.src_table_child1;
Buat tabel dengan menyalin hasil dari kueri SELECT dan konfigurasikan properti tabel baru.
-- Buat tabel sumber. BEGIN; CREATE TABLE public.src_table ( "a" int8 NOT NULL, "b" text NOT NULL, PRIMARY KEY (a) ); CALL SET_TABLE_PROPERTY('public.src_table', 'orientation', 'column'); COMMIT; -- Buat tabel dengan menyalin hasil dari kueri SELECT dengan data disinkronkan secara otomatis dan konfigurasikan properti tabel baru. BEGIN; CREATE TABLE public.new_table AS select * from public.src_table; CALL SET_TABLE_PROPERTY('public.new_table', 'bitmap_columns', 'b'); CALL SET_TABLE_PROPERTY('public.new_table', 'dictionary_encoding_columns', 'b:auto'); CALL SET_TABLE_PROPERTY('public.new_table', 'time_to_live_in_seconds', '3153600'); CALL SET_TABLE_PROPERTY('public.new_table', 'distribution_key', 'a'); COMMIT;