Anda dapat menggunakan pernyataan ALTER TABLE untuk memodifikasi tabel. Modifikasi yang dilakukan pada tabel induk secara otomatis diterapkan ke tabel anaknya. Topik ini menjelaskan cara menggunakan pernyataan ALTER TABLE.
Batasan
Saat memodifikasi tabel di Hologres, perhatikan hal-hal berikut:
Anda dapat mengganti nama tabel, menambah kolom dalam tabel, dan memodifikasi periode time-to-live (TTL) dari tabel.
Anda dapat mengonfigurasi batasan DEFAULT untuk kolom serta memodifikasi properti dictionary_encoding_columns dan bitmap_columns untuk kolom tersebut.
Catatan Penggunaan
Saat memodifikasi properti tabel seperti dictionary_encoding_columns, bitmap_columns, dan time_to_live_in_seconds, operasi tersebut dapat menyebabkan kompaksi asinkron di backend. Ini akan mengonsumsi sumber daya CPU dan dapat meningkatkan kapasitas penyimpanan instance sebelum akhirnya menurun.
Mengubah tipe data
Hologres V3.0 dan versi lebih baru memungkinkan Anda mengubah tipe data kolom dalam tabel internal.
Batasan
Anda dapat mengubah tipe data kolom dalam tabel non-partisi dan tabel induk partisi, tetapi tidak pada tabel anak partisi.
Anda tidak dapat mengubah tipe data kolom kunci partisi dalam tabel induk partisi.
Sintaks COLLATE dan USING tidak didukung.
Tabel berikut menjelaskan konversi tipe data yang didukung.
Tipe data sumber
Tipe data tujuan
Deskripsi
VARCHAR(N)
VARCHAR(M)
M harus lebih besar dari N.
VARCHAR(N)
TEXT
Tidak ada.
CHAR(N)
CHAR(M)
M harus lebih besar dari N.
CHAR(N)
VARCHAR(M)
M harus lebih besar dari atau sama dengan N.
CHAR(N)
TEXT
Tidak ada.
JSON
TEXT
Tidak ada.
VARCHAR(N)[]
VARCHAR(M)[]
M harus lebih besar dari N.
VARCHAR(N)[]
TEXT[]
Tidak ada.
Sintaks
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER [ COLUMN ] <column_name> TYPE <data_type>;Contoh
DROP TABLE IF EXISTS t; CREATE TABLE IF NOT EXISTS t ( a varchar(5) ); INSERT INTO t VALUES ('holo'), ('gres'); ALTER TABLE IF EXISTS t ALTER COLUMN a TYPE text;
Ganti nama tabel asing
Anda dapat mengeksekusi pernyataan ALTER TABLE untuk mengganti nama tabel. Jika tabel tidak ada atau nama tabel baru sama dengan nama tabel yang sudah ada, kesalahan akan dikembalikan.
Anda tidak dapat mengganti nama tabel lintas skema.
Sintaks
-- Ganti nama tabel internal. ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME TO <new_table_name>; -- Ganti nama tabel asing. ALTER FOREIGN TABLE [IF EXISTS] [<schema_name>.]<foreign_table_name> RENAME TO <new_foreign_table_name>;Contoh
-- Ubah nama tabel internal holo_test di skema public menjadi holo_test_1. ALTER TABLE IF EXISTS public.holo_test RENAME TO holo_test_1 ; -- Ubah nama tabel asing foreign_holo_test di skema public menjadi foreign_holo_test_1. ALTER FOREIGN TABLE IF EXISTS public.foreign_holo_test RENAME TO foreign_holo_test_1;
Tambahkan kolom
Anda dapat mengeksekusi pernyataan ALTER TABLE untuk menambahkan kolom yang mengikuti kolom terakhir dalam tabel.
Sintaks
-- Tambahkan satu kolom. ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ADD COLUMN <new_column> <data_type>; -- Tambahkan beberapa kolom. ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ADD COLUMN <new_column_1> <data_type>, ADD COLUMN <new_column_2> <data_type>;Contoh
-- Tambahkan kolom bernama id di tabel holo_test. ALTER TABLE IF EXISTS public.holo_test ADD COLUMN id int;
Hapus kolom (dalam pratinjau publik)
Dalam Hologres V2.0 dan versi lebih baru, Anda dapat menghapus kolom dari tabel.
Batasan
Anda dapat menghapus kolom dari tabel dalam instance Hologres versi V2.0 atau lebih baru. Jika versi instance Hologres Anda lebih lama dari V2.0, Anda dapat secara manual meningkatkan instance Hologres Anda di konsol Hologres atau bergabung dengan grup DingTalk Hologres untuk menghubungi dukungan teknis Hologres. Untuk informasi lebih lanjut tentang cara secara manual meningkatkan instance Hologres Anda di konsol Hologres, lihat Peningkatan manual (beta). Untuk informasi lebih lanjut tentang cara mendapatkan dukungan teknis, lihat Dapatkan dukungan online untuk Hologres.
Jika tabel Anda adalah tabel partisi, Anda dapat menggunakan pernyataan ALTER TABLE untuk menghapus kolom tabel induk, bukan kolom tabel anak tertentu. Setelah mengeksekusi pernyataan untuk menghapus kolom tertentu dari tabel induk, kolom tersebut secara otomatis dihapus dari tabel anak. Menghapus kolom adalah operasi dengan overhead tinggi. Kami merekomendasikan Anda melakukan operasi ini selama jam-jam sepi.
Kolom tabel hanya dapat dihapus oleh pemilik tabel. Jika database tempat tabel Anda berada menggunakan model izin sederhana (SPM), akun Anda harus diberi peran {db}_developer sebelum Anda dapat menggunakan akun tersebut untuk menghapus kolom dari tabel.
Kolom yang dikonfigurasi dengan properti Primary Key, Distribution Key, Clustering Key, atau Event_time_column tidak dapat dihapus.
Anda tidak dapat menghapus kolom dari tabel asing.
Jika Anda menghapus kolom tipe data JSONB, indeks yang dibuat untuk kolom tersebut juga dihapus.
Jika Anda ingin menghapus kolom tipe proxima_vector, Anda perlu menentukan parameter
cascade.Jika Anda menghapus kolom tipe data SERIAL, urutan yang dibuat berdasarkan kolom tersebut juga dihapus.
Jika materialized view dibuat untuk tabel, Anda tidak dapat menghapus tabel atau kolom yang direferensikan oleh materialized view dalam tabel.
Sintaks
PentingAnda tidak dapat menghapus kolom untuk instance sebelum Hologres V2.0.
set hg_experimental_enable_drop_column = on; -- Konfigurasikan parameter Global User Configuration (GUC) untuk mengaktifkan fitur ini. ALTER TABLE IF EXISTS <table_name> DROP COLUMN [ IF EXISTS ] <column> [ RESTRICT | CASCADE ]Contoh
-- Buat tabel. begin; CREATE TABLE tbl ( "id" bigint NOT NULL, "name" text NOT NULL, "age" bigint, "class" text NOT NULL, "reg_timestamp" timestamptz NOT NULL, PRIMARY KEY (id,age) ); call set_table_property('tbl', 'orientation', 'column'); call set_table_property('tbl', 'distribution_key', 'id'); call set_table_property('tbl', 'clustering_key', 'age'); call set_table_property('tbl', 'event_time_column', 'reg_timestamp'); call set_table_property('tbl', 'bitmap_columns', 'name,class'); call set_table_property('tbl', 'dictionary_encoding_columns', 'class:auto'); commit; -- Hapus kolom tertentu. set hg_experimental_enable_drop_column =on; -- Fitur ini dalam pratinjau publik. Untuk mengaktifkan fitur ini, atur parameter GUC. ALTER TABLE IF EXISTS tbl DROP COLUMN name;Kueri data dari tabel.
SELECT*FROMtbl; -- Hasil berikut dikembalikan: id age class reg_timestamp ----+-----+---------+--------------
Ganti nama kolom
Hologres V1.1 dan versi lebih baru memungkinkan Anda mengganti nama kolom tabel.
Jika versi instance Hologres Anda lebih lama dari V1.1, Anda dapat secara manual meningkatkan instance Hologres Anda di konsol Hologres atau bergabung dengan grup DingTalk Hologres untuk menghubungi dukungan teknis Hologres. Untuk informasi lebih lanjut tentang cara secara manual meningkatkan instance Hologres Anda di konsol Hologres, lihat Peningkatan manual (beta). Untuk informasi lebih lanjut tentang cara mendapatkan dukungan teknis, lihat Dapatkan dukungan online untuk Hologres.
Jika tabel Anda adalah tabel partisi, struktur data di tabel induk dan tabel anaknya harus konsisten. Dalam hal ini, hanya kolom tabel induk yang dapat diganti namanya. Kolom tabel anak tidak dapat diganti namanya. Jika kolom tabel anak digunakan di tabel induk, kolom tabel anak secara otomatis diganti namanya agar sesuai dengan kolom tabel induk.
Anda tidak dapat mengganti nama kolom tabel yang berbeda sekaligus.
Kolom tabel hanya dapat diganti namanya oleh pemilik tabel. Jika database tempat tabel Anda berada menggunakan SPM, akun Anda harus diberi peran {db}_developer sebelum Anda dapat menggunakan akun tersebut untuk mengganti nama kolom tabel.
Sintaks
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME COLUMN <old_column_name> TO <new_column_name>;Contoh
-- Ubah nama kolom id di tabel holo_test menjadi name. ALTER TABLE IF EXISTS public.holo_test RENAME COLUMN id TO name;
Konfigurasikan batasan DEFAULT untuk kolom
Anda dapat mengeksekusi pernyataan ALTER TABLE untuk mengonfigurasi batasan DEFAULT untuk kolom dalam tabel. Batasan DEFAULT dapat berupa konstanta atau ekspresi konstan. Konfigurasi ini hanya berlaku untuk data yang ditulis ke atau diperbarui di kolom setelah konfigurasi tetapi tidak mempengaruhi data yang sudah ada di kolom tabel. Anda dapat mengonfigurasi batasan DEFAULT untuk kolom dalam tabel yang dibuat hanya di Hologres V0.9.23 dan versi lebih baru. Dalam skenario ini, pernyataan ALTER TABLE menggunakan sintaks berikut:
Sintaks
-- Tentukan nilai batasan DEFAULT untuk kolom dalam tabel. ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> SET DEFAULT <expression>; -- Hapus nilai batasan DEFAULT untuk kolom dalam tabel. ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> DROP DEFAULT;Contoh
-- Tentukan nilai batasan DEFAULT untuk kolom id di tabel holo_test sebagai 0. ALTER TABLE IF EXISTS holo_test ALTER COLUMN id SET DEFAULT 0; -- Hapus nilai batasan DEFAULT untuk kolom id di tabel holo_test. ALTER TABLE IF EXISTS holo_test ALTER COLUMN id DROP DEFAULT;
Modifikasi properti tabel
Hologres memungkinkan Anda memodifikasi properti tabel dengan memodifikasi parameter terkait dalam pernyataan ALTER TABLE. Anda dapat memodifikasi properti tabel berikut:
dictionary_encoding_columns Saat memodifikasi properti pengkodean kamus, file data dikodekan ulang untuk penyimpanan, yang mengonsumsi sumber daya CPU dan memori. Kami merekomendasikan Anda memodifikasi properti pengkodean kamus selama jam-jam sepi.
Sintaks
-- Modifikasi properti dictionary_encoding_columns (berlaku untuk Hologres V2.1 atau lebih baru). ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]'); -- Properti pengkodean kamus hanya dapat dimodifikasi untuk semua kolom. -- Modifikasi properti dictionary_encoding_columns (berlaku untuk semua versi Hologres) -- Modifikasi properti pengkodean kamus untuk semua kolom. CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]'); -- Modifikasi properti pengkodean kamus hanya untuk kolom yang Anda tentukan dalam pernyataan CALL. Properti pengkodean kamus tetap tidak berubah untuk kolom lainnya. CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]');PentingHologres V2.0 dan versi lebih baru mengoptimalkan sintaks UPDATE_TABLE_PROPERTY. Setelah optimasi, properti
dictionary_encoding_columnstabel tetap tidak berubah selama eksekusi pernyataan berikut. Di versi sebelum Hologres V2.0, propertidictionary_encoding_columnstabel dihapus selama eksekusi pernyataan berikut.CALL UPDATE_TABLE_PROPERTY('<table_name>','dictionary_encoding_columns','');Deskripsi parameter
Parameter
Deskripsi
table_name
Nama tabel yang propertinya ingin Anda modifikasi. Nama tabel bersifat case-sensitive dan dapat diawali dengan nama skema.
on
Mengaktifkan pengkodean kamus untuk kolom.
off
Menonaktifkan pengkodean kamus untuk kolom.
auto
Menentukan apakah akan mengaktifkan pengkodean kamus untuk kolom. Jika Anda menyetel parameter ini untuk kolom, Hologres menentukan apakah akan mengaktifkan pengkodean kamus untuk kolom berdasarkan kemunculan ulang nilai kolom tersebut. Pengkodean kamus lebih cocok untuk kolom yang memiliki kemunculan ulang nilai lebih tinggi. Di Hologres V0.8 dan versi lebih lama, pengkodean kamus diaktifkan secara default untuk semua kolom tipe data TEXT. Di Hologres V0.9 dan versi lebih baru, Hologres menentukan apakah akan mengaktifkan pengkodean kamus untuk kolom berdasarkan karakteristik nilai kolom tersebut.
Contoh
Aktifkan pengkodean kamus untuk kolom a, tentukan Hologres untuk menentukan apakah akan mengaktifkan pengkodean kamus untuk kolom b, dan biarkan pengkodean kamus tetap tidak berubah untuk kolom c dan d.
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL UPDATE_TABLE_PROPERTY('dwd.holo_test','dictionary_encoding_columns','a:on,b:auto');Nonaktifkan pengkodean kamus untuk kolom a. Hologres secara otomatis mengaktifkan pengkodean kamus untuk kolom b, c, dan d.
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL SET_TABLE_PROPERTY('dwd.holo_test','dictionary_encoding_columns','a:off');
bitmap_columns
Di Hologres V0.9 dan versi lebih baru, Anda dapat memodifikasi properti bitmap_columns tabel tanpa perlu membuat tabel lain.
Sintaks
-- Modifikasi properti bitmap_columns (berlaku untuk Hologres V2.1 atau lebih baru). ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (bitmap_columns = '[columnName{:[on|off]}[,...]]'); -- Modifikasi properti bitmap_columns (berlaku untuk semua versi Hologres). -- Modifikasi properti bitmap_columns untuk semua kolom. CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]'); -- Modifikasi properti bitmap_columns hanya untuk kolom yang Anda tentukan dalam pernyataan CALL. Properti tetap tidak berubah untuk kolom lainnya. CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]');PentingDi Hologres V2.0 dan versi lebih baru, sintaks UPDATE_TABLE_PROPERTY dioptimalkan. Setelah optimasi, properti
bitmap_columnstetap tidak berubah untuk kolom dalam tabel selama eksekusi pernyataan berikut. Di versi sebelum Hologres V2.0, propertibitmap_columnsdihapus untuk kolom dalam tabel.CALL UPDATE_TABLE_PROPERTY('<table_name>','bitmap_columns','');Deskripsi parameter
Parameter
Deskripsi
table_name
Nama tabel yang propertinya ingin Anda modifikasi. Nama tabel bersifat case-sensitive dan dapat diawali dengan nama skema.
on
Membuat indeks bitmap untuk bidang.
off
Tidak membuat indeks bitmap untuk bidang.
Contoh
Dalam pernyataan sampel berikut, indeks bitmap dibuat untuk bidang a. Properti bitmap_columns tetap tidak berubah untuk bidang b, c, dan d.
CREATE TABLE dwd.holo_test ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL UPDATE_TABLE_PROPERTY('dwd.holo_test','bitmap_columns','a:on');Dalam pernyataan sampel berikut, tidak ada indeks bitmap yang dibuat untuk bidang b. Hologres membuat indeks bitmap untuk bidang a, c, dan d.
CREATE TABLE dwd.holo_test_1 ( a text NOT NULL, b text NOT NULL, c text NOT NULL, d text ); CALL SET_TABLE_PROPERTY('dwd.holo_test_1','bitmap_columns','b:off');
Properti time_to_live_in_seconds
Sintaks
call set_table_property('[<schema_name>.]<table_name>', 'time_to_live_in_seconds', '<non_negative_literal>');Deskripsi parameter
Parameter
Deskripsi
time_to_live_in_seconds
Periode TTL data dalam tabel, dalam satuan detik. Nilainya harus bilangan bulat positif.
CatatanPeriode TTL tabel Hologres dimulai dari waktu ketika data pertama kali ditulis ke tabel. Setelah periode TTL berakhir, data dalam tabel dihapus dalam periode waktu tertentu, bukan pada titik waktu tertentu.
Contoh
call set_table_property('dwd.holo_test', 'time_to_live_in_seconds', '600');
Mengubah skema tempat tabel berada
Hologres V1.3 dan versi lebih baru memungkinkan Anda mengubah skema tempat tabel berada. Sebagai contoh, Anda dapat memindahkan tabel dari schema1 ke schema2 tanpa perlu membuat tabel lain. Dengan cara ini, Anda dapat mengubah jalur tabel dengan cepat.
Sintaks
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;schema_name: nama skema tempat tabel berada. table_name: nama tabel yang ingin Anda pindahkan ke skema lain. new_schema: nama skema ke mana tabel dipindahkan.
Contoh
Pindahkan tabel bernama tb1 dari skema public ke skema testschema.
ALTER TABLE IF EXISTS public.tbl SET SCHEMA testschema;
Modifikasi tabel di konsol HoloWeb
HoloWeb memungkinkan Anda memodifikasi tabel secara visual. Anda dapat memodifikasi bidang dan properti tabel tanpa perlu mengeksekusi pernyataan SQL. Untuk memodifikasi tabel di konsol HoloWeb, lakukan langkah-langkah berikut:
Masuk ke HoloWeb console. Untuk informasi lebih lanjut, lihat Hubungkan ke HoloWeb dan lakukan kueri.
Di bilah navigasi atas HoloWeb console,klik Metadata Management.
Di tab Metadata Management, klik Instances Connected di panel navigasi sisi kiri dan klik dua kali tabel yang ingin Anda modifikasi.
Di tab detail tabel, modifikasi bidang dan properti tabel.
Klik Submit di pojok kanan atas.