全部产品
Search
文档中心

Hologres:ALTER TABLE

更新时间:Jul 02, 2025

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.

Catatan

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

    Penting

    Anda 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.

Catatan
  • 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]}[,...]]');
      Penting

      Hologres V2.0 dan versi lebih baru mengoptimalkan sintaks UPDATE_TABLE_PROPERTY. Setelah optimasi, properti dictionary_encoding_columns tabel tetap tidak berubah selama eksekusi pernyataan berikut. Di versi sebelum Hologres V2.0, properti dictionary_encoding_columns tabel 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]}[,...]]');
      Penting

      Di Hologres V2.0 dan versi lebih baru, sintaks UPDATE_TABLE_PROPERTY dioptimalkan. Setelah optimasi, properti bitmap_columns tetap tidak berubah untuk kolom dalam tabel selama eksekusi pernyataan berikut. Di versi sebelum Hologres V2.0, properti bitmap_columns dihapus 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.

      Catatan

      Periode 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:

  1. Masuk ke HoloWeb console. Untuk informasi lebih lanjut, lihat Hubungkan ke HoloWeb dan lakukan kueri.

  2. Di bilah navigasi atas HoloWeb console,klik Metadata Management.

  3. Di tab Metadata Management, klik Instances Connected di panel navigasi sisi kiri dan klik dua kali tabel yang ingin Anda modifikasi.

  4. Di tab detail tabel, modifikasi bidang dan properti tabel.

  5. Klik Submit di pojok kanan atas.