ALTER TABLE memodifikasi skema tabel yang sudah ada di AnalyticDB for MySQL. Gunakan perintah ini untuk mengganti nama tabel dan kolom, mengubah tipe data dan kendala kolom, mengelola indeks, menyesuaikan siklus hidup partisi, serta mengonfigurasi kebijakan penyimpanan berjenjang.
Tabel contoh
Sebagian besar contoh dalam topik ini menggunakan tabel customer. Jika Anda belum membuatnya, jalankan pernyataan berikut:
Contoh untuk indeks JSON, kunci asing, dan indeks vektor menggunakan definisi tabel masing-masing.
Sintaksis
ALTER TABLE table_name
{ ADD [COLUMN] column_name column_definition
| ADD [COLUMN] (column_name column_definition,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)
| ADD {INDEX|KEY} [index_name] (column_name)
| ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
| ADD CLUSTERED [INDEX|KEY] [index_name] (column_name [ASC|DESC])
| ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
| COMMENT 'comment'
| DROP CLUSTERED KEY index_name
| DROP [COLUMN] column_name
| DROP FOREIGN KEY symbol
| DROP FULLTEXT INDEX index_name
| DROP {INDEX|KEY} index_name
| DROP PARTITION (partition_name,...)
| MODIFY [COLUMN] column_name column_definition
| RENAME COLUMN column_name TO new_column_name
| RENAME new_table_name
| INDEX_ALL = {'Y'|'N'}
| storage_policy
| PARTITION BY VALUE{(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE N
}
column_definition:
column_type [column_attributes][column_constraints][COMMENT 'comment']
column_attributes:
[DEFAULT{constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT]
column_constraints:
[NULL|NOT NULL]
storage_policy:
STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
Tabel
Ganti nama tabel
ALTER TABLE db_name.table_name RENAME new_table_name
Contoh: Ganti nama customer menjadi new_customer.
ALTER TABLE customer RENAME new_customer;
Ubah komentar tabel
ALTER TABLE db_name.table_name COMMENT 'comment'
Contoh: Perbarui komentar pada tabel customer.
ALTER TABLE customer COMMENT 'Customer table';
Kolom
Tambahkan kolom
ALTER TABLE db_name.table_name ADD [COLUMN]
{column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
| (column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}
Kolom kunci primer tidak dapat ditambahkan.
Contoh 1: Tambahkan kolom province bertipe VARCHAR ke tabel customer.
ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Province';
Example 2: Tambahkan dua kolom sekaligus — vip bertipe BOOLEAN dan tags bertipe VARCHAR.
ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'Is VIP', tags VARCHAR DEFAULT 'None' COMMENT 'Tag');
Hapus kolom
ALTER TABLE db_name.table_name DROP [COLUMN] column_name
Kolom kunci primer tidak dapat dihapus.
Contoh: Hapus kolom province dari tabel customer.
ALTER TABLE adb_demo.customer DROP COLUMN province;
Ganti nama kolom
ALTER TABLE db_name.table_name RENAME COLUMN column_name TO new_column_name
Kolom kunci primer tidak dapat diganti namanya.
Contoh: Ganti nama city_name menjadi city pada tabel customer.
ALTER TABLE customer RENAME COLUMN city_name TO city;
Ubah tipe data kolom
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type
Perubahan tipe data hanya mengikuti aturan pelebaran — Anda dapat memperluas rentang tipe, tetapi tidak menyempitkannya. Tabel berikut merangkum perubahan yang didukung:
| Perubahan | Didukung |
|---|---|
| Integer lebih kecil ke integer lebih besar (misalnya, TINYINT ke BIGINT) | Ya |
| Integer lebih besar ke integer lebih kecil (misalnya, BIGINT ke TINYINT) | Tidak |
| FLOAT ke DOUBLE | Ya |
| DOUBLE ke FLOAT | Tidak |
| Tipe integer ke tipe floating-point (FLOAT atau DOUBLE) | Ya (berlaku persyaratan versi) |
| Meningkatkan presisi DECIMAL | Ya (berlaku persyaratan versi) |
| Mengurangi presisi DECIMAL | Tidak |
| Perubahan tipe data kolom kunci primer | Tidak |
Mengubah tipe integer ke tipe floating-point dan meningkatkan presisi DECIMAL memerlukan kluster dengan versi kernel 3.1.8.10–3.1.8.x, 3.1.9.6–3.1.9.x, 3.1.10.3–3.1.10.x, atau 3.2.0.1 atau lebih baru.
Contoh: Ubah kolom age dari INT ke BIGINT.
ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;
Ubah nilai default kolom
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}
Contoh 1: Tetapkan nilai default sex menjadi 0.
ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;
Contoh 2: Tetapkan nilai default login_time menjadi CURRENT_TIMESTAMP.
ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Izinkan nilai NULL
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type NULL
Hanya perubahan dari NOT NULL ke NULL yang didukung. Mengubah NULL ke NOT NULL tidak didukung.
Contoh: Izinkan kolom province menerima nilai NULL.
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;
Ubah komentar kolom
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'
Contoh: Perbarui komentar pada kolom province.
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'The province where the customer is located';
Indeks
Tambahkan indeks reguler
Secara default, tabel XUANWU_V2 dibuat tanpa indeks seluruh kolom (INDEX_ALL='N'), sedangkan tabel XUANWU menyertakannya (INDEX_ALL='Y'). Tambahkan indeks ke kolom individual sesuai kebutuhan.
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)
Kolom tersebut harus memiliki tipe data sederhana. Untuk kolom JSON, lihat Tambahkan indeks JSON.
Contoh: Tambahkan indeks ke kolom age.
ALTER TABLE adb_demo.customer ADD KEY age_idx(age);
Modifikasi indeks seluruh kolom
Untuk tabel XUANWU_V2, aktifkan/nonaktifkan pengindeksan seluruh kolom setelah pembuatan tabel menggunakan properti INDEX_ALL. Pengaturan ini tidak memengaruhi indeks JSON, teks penuh, atau vektor.
Prasyarat
Tabel XUANWU_V2 harus berada di kluster dengan versi kernel 3.2.3.7 atau lebih baru, atau 3.2.4.3 atau lebih baru.
Untuk melihat dan memperbarui versi minor kluster Anda, login ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information.
ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};
| Nilai | Efek |
|---|---|
Y |
Mode indeks seluruh kolom: membuat indeks reguler untuk semua kolom |
N |
Mode non-indeks seluruh kolom: hanya menyimpan indeks kunci primer; semua indeks reguler lainnya dihapus |
Catatan penggunaan:
-
Untuk tabel XUANWU, pengindeksan seluruh kolom hanya dapat dikonfigurasi saat pembuatan tabel. Untuk menonaktifkannya, hapus indeks satu per satu.
-
Jika
INDEX_ALL='Y'dan Anda menghapus indeks reguler menggunakan pernyataan Data Definition Language (DDL), properti tersebut secara otomatis berubah menjadiINDEX_ALL='N'. Hanya indeks target yang dihapus; indeks lain tidak terpengaruh. -
Saat
INDEX_ALL='N',SHOW CREATE TABLEmungkin tidak secara eksplisit menampilkan properti ini, tetapi tetap berlaku.
Contoh 1: Nonaktifkan pengindeksan seluruh kolom pada tabel customer (saat ini INDEX_ALL='Y').
ALTER TABLE adb_demo.customer INDEX_ALL = 'N';
Setelah dieksekusi, indeks reguler pada kolom non-kunci primer seperti customer_name, city_name, dan sex dihapus.
Contoh 2: Aktifkan pengindeksan seluruh kolom pada tabel customer (saat ini INDEX_ALL='N', dengan indeks yang sudah ada pada customer_id, phone_num, dan login_time).
ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';
Setelah dieksekusi, indeks reguler dibuat untuk semua kolom yang belum memiliki indeks, seperti customer_name, city_name, dan sex.
Tambahkan indeks JSON
Catatan penggunaan
Perilaku indeks JSON berbeda berdasarkan mesin tabel:
-
Tabel XUANWU_V2 (partisi dan non-partisi): indeks langsung berlaku — tidak perlu pekerjaan BUILD.
-
Tabel XUANWU non-partisi: indeks hanya berlaku setelah pekerjaan BUILD selesai.
-
Tabel XUANWU partisi: picu secara manual pekerjaan BUILD seluruh tabel. Indeks hanya berlaku setelah pekerjaan BUILD selesai.
Indeks JSON
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| Parameter | Deskripsi |
|---|---|
column_name |
Membuat indeks pada kolom JSON. Kolom harus bertipe JSON. |
column_name->'$.json_path' |
Membuat indeks pada kunci properti tertentu dalam objek JSON. Untuk informasi lebih lanjut, lihat JSON indexes. |
-
Sintaksis
column_name->'$.json_path'memerlukan versi kluster V3.1.6.8 atau lebih baru. Untuk melihat dan memperbarui versi minor, login ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information. -
Jika kolom JSON sudah memiliki indeks, hapus terlebih dahulu sebelum membuat indeks pada kunci properti kolom tersebut.
Contoh: Buat indeks JSON pada properti a dari kolom vj.
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1,'{"a":1,"b":2}'),(2,'{"a":2,"b":3}');ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');
Indeks Array JSON
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
column_name->'$[*]' menentukan kolom Array JSON yang akan diindeks. Misalnya, vj->'$[*]' membuat indeks Array JSON pada kolom vj.
Contoh: Buat indeks Array JSON pada kolom vj.
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');
Hapus indeks reguler atau JSON
ALTER TABLE db_name.table_name DROP KEY index_name
Jalankan SHOW INDEX FROM db_name.table_name; untuk menemukan nama indeks.
Contoh 1: Hapus indeks age_idx dari tabel customer.
ALTER TABLE adb_demo.customer DROP KEY age_idx;
Contoh 2: Hapus indeks JSON Array index_vj dari json_test.
ALTER TABLE adb_demo.customer DROP KEY index_vj;
Tambahkan indeks terkluster
ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])
Catatan penggunaan:
-
Indeks terkluster diurutkan secara ascending (ASC) secara default. Untuk beban kerja yang diurutkan secara descending, atur DESC saat membuat tabel.
-
Satu tabel hanya dapat memiliki satu indeks terkluster.
-
Setelah menambahkan indeks terkluster, picu dan selesaikan pekerjaan BUILD agar berlaku. Jalankan
SHOW CREATE TABLE db_name.table_name;untuk mengonfirmasi.
Contoh: Tambahkan indeks terkluster pada customer_id.
ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);
Hapus indeks terkluster
ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name
Jalankan SHOW CREATE TABLE db_name.table_name untuk menemukan nama indeks terkluster.
Contoh: Hapus indeks terkluster bernama index dari tabel customer.
ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;
Tambahkan indeks teks penuh
Prasyarat
Kluster AnalyticDB for MySQL versi V3.1.4.9 atau lebih baru. Untuk hasil terbaik, gunakan V3.1.4.17 atau lebih baru.
Untuk informasi cara menanyakan versi minor, lihat How do I query the version of an AnalyticDB for MySQL cluster?
ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| Parameter | Deskripsi |
|---|---|
column_name |
Kolom yang akan diindeks. Harus bertipe VARCHAR. |
index_option |
Opsional. Menentukan pemisah kata dan kamus kustom. |
WITH ANALYZER analyzer_name |
Alat analisis untuk indeks teks penuh. Lihat Analyzers for full-text indexes. |
WITH DICT tbl_dict_name |
Kamus kustom untuk indeks teks penuh. Lihat Custom dictionaries for full-text indexes. |
Indeks teks penuh hanya berlaku setelah pekerjaan BUILD dipicu dan diselesaikan.
Contoh: Tambahkan indeks teks penuh ke kolom home_address menggunakan alat analisis standard.
ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;
Untuk informasi lebih lanjut, lihat Create a full-text index.
Hapus indeks teks penuh
ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name
Contoh: Hapus indeks teks penuh fidx_k dari tabel customer.
ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;
Tambahkan indeks vektor
Prasyarat
Kluster AnalyticDB for MySQL versi V3.1.4.0 atau lebih baru. Versi minor yang direkomendasikan: 3.1.5.16, 3.1.6.8, 3.1.8.6, dan lebih baru.
Jika kluster Anda tidak menggunakan salah satu versi yang direkomendasikan, atur CSTORE_PROJECT_PUSH_DOWN dan CSTORE_PPD_TOP_N_ENABLE ke false sebelum menggunakan pencarian vektor. Untuk memperbarui versi minor, hubungi dukungan teknis. Untuk informasi cara menanyakan versi minor, lihat How do I query the version of an AnalyticDB for MySQL cluster?
ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ] [distancemeasure=SquaredL2]
| Parameter | Deskripsi |
|---|---|
index_name |
Nama indeks. Untuk konvensi penamaan, lihat bagian Naming limits. |
column_name |
Kolom vektor yang akan diindeks. Tipe kolom harus array<float>, array<byte>, atau array<smallint>. |
algorithm |
Algoritma yang digunakan untuk menghitung jarak vektor. Atur ke HNSW_PQ. |
distancemeasure |
Rumus jarak. Atur ke SquaredL2. Rumus: (x1-y1)^2 + (x2-y2)^2 + ... + (xn-yn)^2. |
Contoh: Buat indeks vektor pada kolom float_feature dan short_feature.
CREATE TABLE vector (
xid BIGINT NOT NULL,
cid BIGINT NOT NULL,
uid VARCHAR NOT NULL,
vid VARCHAR NOT NULL,
wid VARCHAR NOT NULL,
float_feature array<FLOAT>(4),
short_feature array<SMALLINT>(4),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);
Tambahkan kunci asing
Prasyarat
Kluster AnalyticDB for MySQL versi V3.1.10 atau lebih baru.
Untuk melihat dan memperbarui versi minor, masuk ke Konsol AnalyticDB for MySQL, lalu buka bagian Configuration Information pada halaman Cluster Information.
ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)
| Parameter | Deskripsi |
|---|---|
db_name.table_name |
Tabel tempat menambahkan kunci asing. |
symbol |
Opsional. Nama kendala kunci asing — harus unik dalam tabel. Jika dihilangkan, parser menggunakan <fk_column_name>_fk sebagai nama kendala. |
fk_column_name |
Kolom kunci asing. Harus sudah ada. |
pk_table_name |
Tabel utama. Harus sudah ada. |
pk_column_name |
Kolom kunci primer dari tabel utama. Harus sudah ada. |
Catatan penggunaan:
-
Satu tabel dapat memiliki beberapa indeks kunci asing.
-
Indeks kunci asing tidak dapat mencakup beberapa kolom (misalnya,
FOREIGN KEY (sr_item_sk, sr_ticket_number)tidak didukung). -
AnalyticDB for MySQL tidak menegakkan kendala data. Validasi hubungan kendala antara kunci primer dan kunci asing di aplikasi Anda.
-
Kendala kunci asing tidak dapat ditambahkan ke tabel eksternal.
Contoh: Tambahkan kunci asing pada store_sales yang mereferensi tabel item.
CREATE TABLE item
(
i_item_sk BIGINT NOT NULL,
i_current_price BIGINT,
PRIMARY KEY(i_item_sk)
)
DISTRIBUTED BY HASH(i_item_sk);
CREATE TABLE store_sales
(
ss_sale_id BIGINT,
ss_store_sk BIGINT,
ss_item_sk BIGINT NOT NULL,
PRIMARY KEY(ss_sale_id)
);ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);
Untuk informasi lebih lanjut, lihat Eliminate unnecessary joins using primary and foreign key constraints.
Hapus kunci asing
ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol
Contoh:
ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;
Partisi
Ubah siklus hidup partisi
ALTER TABLE db_name.table_name PARTITIONS N
Catatan penggunaan:
-
Pada kluster dengan versi kernel 3.2.4.1 atau lebih baru, atur
Nke0untuk menghapus manajemen siklus hidup partisi. -
Siklus hidup baru hanya berlaku setelah pekerjaan BUILD dipicu dan diselesaikan. Jalankan
SHOW CREATE TABLE db_name.table_name;untuk memverifikasi.
Contoh 1: Hapus siklus hidup dari tabel customer.
ALTER TABLE customer PARTITIONS 0;
Contoh 2: Ubah siklus hidup dari 30 hari menjadi 40 hari.
ALTER TABLE customer PARTITIONS 40;
Hapus partisi
ALTER TABLE DROP PARTITIONmemiliki efek yang sama denganTRUNCATE TABLE PARTITION.
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)
Menghapus partisi akan menghapus permanen semua data dalam partisi tersebut. Tindakan ini tidak dapat dikembalikan.
Contoh 1: Hapus partisi 20241220 dari tabel customer.
ALTER TABLE adb_demo.customer DROP PARTITION (20241220);
Contoh 2: Hapus partisi 20241218 dan 20241219.
ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);
Kebijakan penyimpanan
Ubah kebijakan penyimpanan berjenjang
Prasyarat
-
Kluster menggunakan Edisi Perusahaan, Edisi Dasar, Edisi Data Lakehouse, atau Edisi Data Warehouse (mode Elastis).
-
Persyaratan versi kernel:
-
Tabel XUANWU: tidak ada batasan versi kernel.
-
Tabel XUANWU_V2: versi kernel harus 3.2.2.15 atau lebih baru, 3.2.3.13 atau lebih baru, 3.2.4.9 atau lebih baru, atau 3.2.5.3 atau lebih baru.
-
Untuk melihat dan memperbarui versi minor, login ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information.
Untuk tabel XUANWU_V2, tugas terjadwal untuk memindahkan data antara penyimpanan hot dan cold harus diaktifkan:
-
Periksa status:
SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;-
Jika hasilnya
FALSE, tugas dinonaktifkan dan harus diaktifkan. -
Jika terjadi error, parameter belum diatur dan default-nya
TRUE.
-
-
Aktifkan tugas:
SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;
ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
Kebijakan penyimpanan baru hanya berlaku setelah pekerjaan BUILD untuk tabel dipicu dan diselesaikan. Secara default, pekerjaan ini berjalan otomatis di latar belakang. Sebelum pekerjaan BUILD selesai, jumlah partisi hot yang dilaporkan olehinformation_schema.table_usagemungkin berbeda dari kebijakan yang dikonfigurasi. JalankanSHOW CREATE TABLE db_name.table_name;untuk mengonfirmasi kebijakan telah berlaku.
Contoh 1: Atur kebijakan penyimpanan ke COLD.
ALTER TABLE customer storage_policy = 'COLD';
Contoh 2: Atur kebijakan penyimpanan ke HOT.
ALTER TABLE customer storage_policy = 'HOT';
Contoh 3: Atur kebijakan penyimpanan ke MIXED dengan 10 partisi hot.
ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;