Pernyataan ALTER TABLE digunakan untuk memodifikasi tabel. Perubahan pada tabel induk dari tabel partisi secara otomatis diterapkan ke tabel anaknya. Topik ini menjelaskan cara menggunakan pernyataan ALTER TABLE.
Batasan
Hologres mendukung modifikasi tabel berikut:
-
Mengganti nama tabel, menambah kolom, dan memodifikasi masa hidup data (TTL) tabel.
-
Memodifikasi nilai default suatu bidang serta properti dictionary_encoding_columns dan bitmap_columns.
Catatan
Memodifikasi properti tabel seperti dictionary_encoding_columns, bitmap_columns, dan time_to_live_in_seconds dapat memicu proses kompaksi asinkron di latar belakang. Proses ini mengonsumsi sumber daya CPU, dan penggunaan penyimpanan instans mungkin meningkat sebelum akhirnya berkurang.
Modifikasi tipe data
Mulai dari Hologres V3.0, Anda dapat memodifikasi tipe data kolom pada tabel internal.
-
Batasan
-
Anda dapat memodifikasi tipe kolom pada tabel non-partisi dan tabel induk dari tabel partisi, tetapi tidak pada tabel anak.
-
Anda tidak dapat memodifikasi tipe data kolom kunci partisi pada tabel induk.
-
Klausa COLLATE dan USING tidak didukung.
-
Hanya konversi tipe data berikut yang didukung:
Source data type
Target type
Catatan
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
-
-
Sintaksis
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
Anda dapat menggunakan pernyataan ALTER TABLE untuk mengganti nama tabel. Sistem akan mengembalikan error jika tabel target tidak ada atau jika nama tabel baru sudah digunakan.
Anda tidak dapat mengganti nama tabel lintas skema.
-
Sintaksis
-- Rename an internal table ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME TO <new_table_name>; -- Rename a foreign table ALTER FOREIGN TABLE [IF EXISTS] [<schema_name>.]<foreign_table_name> RENAME TO <new_foreign_table_name>; -
Contoh
-- Ganti nama tabel holo_test menjadi holo_test_1 ALTER TABLE IF EXISTS public.holo_test RENAME TO holo_test_1 ; -- Ganti nama tabel eksternal foreign_holo_test menjadi foreign_holo_test_1 ALTER FOREIGN TABLE IF EXISTS public.foreign_holo_test RENAME TO foreign_holo_test_1;
Tambah kolom
Anda dapat menggunakan pernyataan ALTER TABLE untuk menambahkan kolom ke dalam tabel. Kolom baru hanya dapat ditambahkan setelah kolom terakhir yang sudah ada.
-
Sintaksis
-- Tambah kolom ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ADD COLUMN <new_column> <data_type>; -- Tambah 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
-- Tambah kolom id ke tabel holo_test ALTER TABLE IF EXISTS public.holo_test ADD COLUMN id int;
Hapus kolom (Beta)
Mulai dari Hologres V2.0, Anda dapat menghapus kolom. Sintaksisnya sebagai berikut.
-
Batasan
-
Fitur ini hanya tersedia di Hologres V2.0 dan versi selanjutnya. Jika instans Anda lebih lama dari V2.0, lihat Common errors when preparing for an upgrade atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi lebih lanjut, lihat How do I get more online support?.
-
Jika Anda menggunakan tabel partisi, Anda hanya dapat menghapus kolom dari tabel induk, bukan langsung dari tabel anak. Saat kolom dihapus dari tabel induk, kolom tersebut secara otomatis dihapus dari semua tabel anaknya. Operasi ini memiliki overhead tinggi. Kami menyarankan Anda melakukan operasi ini pada jam sepi.
-
Hanya pemilik tabel yang dapat menghapus kolom. Jika database Anda menggunakan model izin sederhana, Anda harus memiliki izin dari kelompok pengguna developer.
-
Anda tidak dapat menghapus kolom yang ditetapkan sebagai Primary Key, Distribution Key, Clustering Key, atau Event_time_column.
-
Anda tidak dapat menghapus kolom dari tabel eksternal.
-
Saat Anda menghapus kolom terkait JSONB, indeks JSONB terkait juga akan dihapus.
-
Saat Anda menghapus kolom proxima_vector, Anda harus menentukan parameter
cascade. -
Saat Anda menghapus kolom Serial, jika sequence dibuat berdasarkan kolom ini, sequence tersebut juga akan dihapus.
-
Jika Tampilan yang di-materialisasi dibuat untuk suatu tabel, Anda tidak dapat menghapus tabel sumber atau kolom apa pun dalam tabel sumber yang dirujuk oleh Tampilan yang di-materialisasi tersebut.
-
-
Sintaksis
PentingAnda tidak dapat menghapus kolom di versi Hologres sebelum V2.0.
set hg_experimental_enable_drop_column = on; --Aktifkan fitur ini menggunakan parameter GUC 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 masih dalam beta. Anda harus mengaktifkannya menggunakan parameter GUC ini. ALTER TABLE IF EXISTS tbl DROP COLUMN name;Kueri tabel:
SELECT*FROMtbl; -- Hasil berikut dikembalikan: id age class reg_timestamp ----+-----+---------+--------------
Ganti nama kolom
Mulai dari Hologres V1.1, Anda dapat mengganti nama kolom. Sintaksisnya sebagai berikut.
-
Jika instans Anda lebih lama dari V1.1, lihat Common errors when preparing for an upgrade atau bergabunglah dengan grup DingTalk Hologres untuk memberikan masukan. Untuk informasi lebih lanjut, lihat How do I get more online support?.
-
Jika Anda menggunakan tabel partisi, Anda hanya dapat mengganti nama kolom pada tabel induk, bukan pada tabel anak tertentu. Struktur data tabel induk dan tabel anaknya harus konsisten. Saat Anda mengganti nama kolom pada tabel induk, perubahan tersebut secara otomatis diterapkan ke semua tabel anak.
-
Anda tidak dapat mengganti nama kolom di beberapa tabel sekaligus.
-
Hanya pemilik tabel yang dapat mengganti nama kolom. Jika database Anda menggunakan model izin sederhana, Anda harus memiliki izin dari kelompok pengguna developer.
-
Sintaksis
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> RENAME COLUMN <old_column_name> TO <new_column_name>; -
Contoh
-- Ganti nama kolom id pada tabel holo_test menjadi name ALTER TABLE IF EXISTS public.holo_test RENAME COLUMN id TO name;
Modifikasi nilai default
Anda dapat menggunakan pernyataan ALTER TABLE untuk memodifikasi nilai default suatu kolom. Nilai default dapat berupa konstanta atau ekspresi konstanta. Nilai default baru hanya berlaku untuk data yang ditulis atau diperbarui setelah perubahan dilakukan dan tidak memengaruhi data yang sudah ada di tabel. Fitur ini hanya tersedia di Hologres V0.9.23 dan versi selanjutnya. Bagian berikut menjelaskan cara memodifikasi nilai default.
-
Sintaksis
-- Modifikasi nilai default bidang tabel ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> SET DEFAULT <expression>; -- Hapus nilai default bidang tabel ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> ALTER COLUMN <column> DROP DEFAULT; -
Contoh
-- Atur nilai default kolom id pada tabel holo_test menjadi 0 ALTER TABLE IF EXISTS holo_test ALTER COLUMN id SET DEFAULT 0; -- Hapus nilai default kolom id pada tabel holo_test ALTER TABLE IF EXISTS holo_test ALTER COLUMN id DROP DEFAULT;
Modifikasi properti tabel
Di Hologres, Anda dapat mengeksekusi pernyataan untuk memodifikasi parameter dan mengubah properti tabel. Bagian berikut menjelaskan cara memodifikasi properti tabel.
-
Modifikasi properti dictionary_encoding_columns. Mengubah pengaturan encoding kamus akan menyebabkan file data di-encode ulang, yang mengonsumsi sumber daya CPU dan memori selama periode tertentu. Disarankan untuk melakukan perubahan ini pada jam sepi.
-
Sintaksis
-- Modifikasi dictionary_encoding_columns (tersedia mulai V2.1) ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]'); --Hanya modifikasi penuh yang didukung. -- Modifikasi dictionary_encoding_columns (semua versi) --Modifikasi penuh CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]'); --Modifikasi inkremental. Hanya bidang yang ditentukan dalam panggilan yang dimodifikasi. Bidang lain tetap tidak berubah. CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]');PentingMulai dari Hologres V2.0, sintaksis UPDATE_TABLE_PROPERTY dioptimalkan. Saat Anda menjalankan pernyataan berikut, properti
dictionary_encoding_columnstabel tetap tidak berubah. Di versi Hologres sebelum V2.0, propertidictionary_encoding_columnstabel dihapus.CALL UPDATE_TABLE_PROPERTY('<table_name>','dictionary_encoding_columns',''); -
Deskripsi parameter
Parameter
Deskripsi
table_name
Nama tabel bersifat case-sensitive dan dapat mencakup informasi skema.
on
Mengaktifkan dictionary_encoding_columns untuk bidang saat ini.
off
Menonaktifkan dictionary_encoding_columns untuk bidang saat ini.
auto
Otomatis. Jika Anda mengatur parameter ini ke auto, Hologres secara otomatis menentukan apakah akan mengaktifkan dictionary_encoding_columns berdasarkan tingkat pengulangan nilai dalam kolom tersebut. Tingkat pengulangan yang lebih tinggi memberikan manfaat lebih besar dari encoding kamus. Di Hologres V0.8 dan versi sebelumnya, dictionary_encoding_columns diaktifkan secara default untuk semua kolom teks. Di Hologres V0.9 dan versi selanjutnya, Hologres secara otomatis menentukan apakah akan membuat encoding kamus berdasarkan karakteristik data.
-
Contoh
-
Buat kamus secara eksplisit untuk kolom a, tentukan secara otomatis apakah akan membuat kamus untuk kolom b, dan jangan buat kamus untuk kolom c atau 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 secara eksplisit kamus untuk kolom a. Sistem secara otomatis menambahkan indeks kamus ke 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');
-
-
-
Modifikasi properti bitmap_columns
Mulai dari Hologres V0.9, Anda dapat memodifikasi properti bitmap_columns dengan mengeksekusi pernyataan berikut tanpa perlu membuat ulang tabel.
-
Sintaksis
-- Modifikasi bitmap_columns (tersedia mulai V2.1) ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (bitmap_columns = '[columnName{:[on|off]}[,...]]'); -- Modifikasi bitmap_columns (semua versi) --Modifikasi penuh CALL SET_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]'); --Modifikasi inkremental. Hanya bidang yang ditentukan dalam panggilan yang dimodifikasi. Bidang lain tetap tidak berubah. CALL UPDATE_TABLE_PROPERTY('[<schema_name>.]<table_name>', 'bitmap_columns', '[columnName{:[on|off]}[,...]]');PentingMulai dari Hologres V2.0, sintaksis UPDATE_TABLE_PROPERTY dioptimalkan. Saat Anda menjalankan pernyataan berikut, properti
bitmap_columnstabel tetap tidak berubah. Di versi Hologres sebelum V2.0, propertibitmap_columnstabel dihapus.CALL UPDATE_TABLE_PROPERTY('<table_name>','bitmap_columns',''); -
Deskripsi parameter
Parameter
Deskripsi
table_name
Nama tabel bersifat case-sensitive dan dapat mencakup informasi skema.
on
Mengaktifkan bitmap_columns untuk bidang saat ini.
off
Menonaktifkan bitmap_columns untuk bidang saat ini.
-
Contoh
-
Aktifkan indeks bitmap untuk kolom a, dan nonaktifkan 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 UPDATE_TABLE_PROPERTY('dwd.holo_test','bitmap_columns','a:on'); -
Nonaktifkan indeks bitmap untuk kolom b. Sistem secara otomatis membuat indeks bitmap untuk kolom 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');
-
-
-
Modifikasi TTL data tabel
-
Sintaksis
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
Disingkat sebagai TTL. Masa hidup data tabel, dalam satuan detik. Nilainya harus berupa bilangan bulat positif.
CatatanTTL dimulai saat data ditulis ke Hologres. Setelah periode yang ditentukan berakhir, data tersebut dihapus. Penghapusan tidak presisi hingga detik.
-
Contoh
call set_table_property('dwd.holo_test', 'time_to_live_in_seconds', '600');
-
Modifikasi skema tabel
Mulai dari Hologres V1.3, Anda dapat memodifikasi skema tabel. Misalnya, Anda dapat memindahkan tabel dari schema1 ke schema2 tanpa perlu membuat ulang tabel atau mengimpor data, sehingga memungkinkan perpindahan jalur tabel secara cepat.
-
Sintaksis
ALTER TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;schema_name adalah nama skema tempat tabel berada, table_name adalah nama tabel yang akan dimodifikasi, dan new_schema adalah nama skema baru tempat tabel tersebut dipindahkan.
-
Contoh
Pindahkan tabel bernama tb1 dari skema public ke skema testschema.
ALTER TABLE IF EXISTS public.tbl SET SCHEMA testschema;
Modifikasi tabel menggunakan editor visual HoloWeb
HoloWeb menyediakan editor visual untuk tabel. Anda dapat memodifikasi bidang tabel dan beberapa properti tabel tanpa menulis perintah SQL. Langkah-langkahnya sebagai berikut.
-
Buka halaman HoloWeb. Untuk informasi selengkapnya, lihat Connect to HoloWeb and run a query.
-
Pada bilah menu atas halaman HoloWeb, klik Metadata Management.
-
Pada daftar Logged-in Instances di sisi kiri halaman Metadata Management, klik ganda tabel target yang ingin Anda modifikasi.
-
Pada halaman detail tabel, Anda dapat memodifikasi bidang tabel dan beberapa properti tabel secara visual.

-
Di pojok kanan atas, klik Submit untuk menyelesaikan modifikasi.