全部产品
Search
文档中心

AnalyticDB:ALTER TABLE

更新时间:Nov 12, 2025

Anda dapat menggunakan pernyataan ALTER TABLE di AnalyticDB for MySQL untuk memodifikasi skema tabel. Pernyataan ini memungkinkan Anda mengubah nama tabel, nama kolom, tipe data kolom, indeks reguler, indeks terkluster, kunci asing, format fungsi partisi, dan kebijakan penyimpanan bertingkat. Topik ini menjelaskan sintaks ALTER TABLE.

Sintaks

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}

Semua contoh dalam topik ini, kecuali yang melibatkan indeks JSON, kunci asing, dan indeks vektor, didasarkan pada tabel customer yang dibuat dalam topik CREATE TABLE. Jika Anda telah membuat tabel customer, Anda dapat menjalankan contoh dalam topik ini. Jika belum, salin dan jalankan pernyataan berikut untuk membuat tabel customer.

Pernyataan contoh untuk membuat tabel

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT 'ID Pelanggan',
  customer_name VARCHAR NOT NULL COMMENT 'Nama pelanggan',
  phone_num BIGINT NOT NULL COMMENT 'Nomor telepon',
  city_name VARCHAR NOT NULL COMMENT 'Kota',
  sex INT NOT NULL COMMENT 'Jenis kelamin',
  id_number VARCHAR NOT NULL COMMENT 'Nomor KTP',
  home_address VARCHAR NOT NULL COMMENT 'Alamat rumah',
  office_address VARCHAR NOT NULL COMMENT 'Alamat kantor',
  age INT NOT NULL COMMENT 'Usia',
  login_time TIMESTAMP NOT NULL COMMENT 'Waktu logon',
  PRIMARY KEY (login_time,customer_id,phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT 'Tabel informasi pelanggan';                   

Tabel

Mengubah nama tabel

Sintaks

ALTER TABLE db_name.table_name RENAME new_table_name

Contoh

Ganti nama tabel customer menjadi new_customer.

ALTER TABLE customer RENAME new_customer;

Mengubah komentar tabel

Sintaks

ALTER TABLE db_name.table_name COMMENT 'comment'

Contoh

Ubah komentar untuk tabel customer menjadi 'Tabel pelanggan'.

ALTER TABLE customer COMMENT 'Tabel pelanggan';;

Kolom

Menambahkan kolom

Sintaks

ALTER TABLE db_name.table_name ADD [COLUMN] 
 {column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
 | (column column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}

Catatan

Anda tidak dapat menambahkan kolom kunci primer.

Contoh

  • Tambahkan kolom bernama province dengan tipe VARCHAR ke tabel customer.

ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Provinsi';
  • Tambahkan dua kolom ke tabel customer: kolom bernama vip dengan tipe BOOLEAN dan kolom bernama tags dengan tipe VARCHAR.

ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'Apakah VIP',tags VARCHAR DEFAULT 'None' COMMENT 'Tag');

Menghapus kolom

Sintaks

ALTER TABLE db_name.table_name DROP [COLUMN] column_name

Catatan

Anda tidak dapat menghapus kolom kunci primer.

Contoh

Hapus kolom province dengan tipe VARCHAR dari tabel customer.

ALTER TABLE adb_demo.customer DROP COLUMN province;

Mengubah nama kolom

Sintaks

ALTER TABLE db_name.table_name RENAME COLUMN column_name to  new_column_name

Catatan

Anda tidak dapat mengubah nama kolom kunci primer.

Contoh

Ubah nama kolom city_name menjadi city di tabel customer.

ALTER TABLE customer RENAME COLUMN city_name to city;

Mengubah tipe data kolom

Sintaks

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type

Catatan

  • Anda tidak dapat mengubah tipe data kolom kunci primer.

  • Batasan berikut berlaku untuk perubahan tipe data:

    • Anda hanya dapat mengubah tipe data menjadi tipe data lain dengan rentang nilai yang lebih luas.

    • Tipe data integer: Anda dapat mengubah tipe integer yang lebih kecil menjadi yang lebih besar, misalnya dari TINYINT ke BIGINT. Anda tidak dapat mengubah dari BIGINT ke TINYINT. Tipe integer yang didukung adalah TINYINT, SMALLINT, INT, dan BIGINT.

    • Tipe data floating-point: Anda dapat mengubah FLOAT menjadi DOUBLE, tetapi tidak sebaliknya.

    • Anda dapat mengubah tipe data integer (TINYINT, SMALLINT, INT, atau BIGINT) menjadi tipe data floating-point (FLOAT atau DOUBLE).

    • Anda dapat meningkatkan presisi tipe DECIMAL. Anda tidak dapat menurunkan presisi.

    Penting

    Hanya kluster dengan versi kernel 3.1.8.10 hingga 3.1.8.x, 3.1.9.6 hingga 3.1.9.x, 3.1.10.3 hingga 3.1.10.x, atau 3.2.0.1 atau lebih baru yang mendukung pengubahan tipe data integer menjadi tipe data floating-point dan perubahan presisi tipe DECIMAL.

Contoh

Ubah tipe data kolom age di tabel customer dari INT menjadi BIGINT.

ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;

Mengubah nilai default kolom

Sintaks

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}

Contoh

  • Tetapkan nilai default kolom sex di tabel customer menjadi 0.

ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;
  • Tetapkan nilai default kolom login_time di tabel customer menjadi CURRENT_TIMESTAMP.

ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Mengizinkan nilai NULL

Sintaks

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type {NULL}

Catatan

Anda hanya dapat mengubah kendala NOT NULL menjadi NULL.

Contoh

Izinkan kolom province di tabel customer menerima nilai NULL.

ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;

Mengubah komentar kolom

Sintaks

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'

Contoh

Ubah komentar kolom province di tabel customer menjadi 'Provinsi tempat pelanggan berada'.

ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'Provinsi tempat pelanggan berada';

Indeks

Menambahkan indeks

Secara default, AnalyticDB for MySQL tidak membuat indeks kolom penuh untuk tabel XUANWU_V2 (INDEX_ALL='N'), tetapi membuatnya untuk tabel XUANWU (INDEX_ALL='Y'). Jika indeks kolom penuh tidak dibuat saat Anda membuat tabel XUANWU_V2 atau XUANWU, Anda dapat menambahkan indeks ke kolom.

Sintaks

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)

Deskripsi parameter

column_name: Nama kolom. Kolom harus memiliki tipe data sederhana. Jika kolom bertipe data JSON, lihat Menambahkan indeks JSON.

Contoh

Tambahkan indeks ke kolom age di tabel customer.

ALTER TABLE adb_demo.customer ADD KEY age_idx(age);

Memodifikasi indeks kolom penuh

Untuk tabel XUANWU_V2 di AnalyticDB for MySQL, Anda dapat memodifikasi indeks kolom penuh setelah tabel dibuat. Ini dikonfigurasi menggunakan properti tabel INDEX_ALL. Operasi ini tidak memengaruhi indeks non-reguler, seperti indeks JSON, teks penuh, dan vektor.

Prasyarat

Tabel XUANWU_V2 berada di kluster dengan versi mesin utama 3.2.3.7 atau lebih baru, atau 3.2.4.3 atau lebih baru.

Catatan

Untuk melihat dan memperbarui versi minor kluster AnalyticDB for MySQL, masuk ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information.

Sintaks

ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};

Deskripsi parameter

INDEX_ALL: Menentukan apakah akan membuat indeks reguler untuk semua kolom. Nilai yang valid:

  • Y: Mode indeks kolom penuh. Membuat indeks reguler untuk semua kolom.

    Jika Anda mengubah properti tabel dari INDEX_ALL='N' menjadi INDEX_ALL='Y', indeks reguler dibuat untuk semua kolom yang belum memilikinya.

  • N: Mode non-indeks kolom penuh. Membuat indeks reguler hanya untuk kunci primer. Kolom lain tidak akan memiliki indeks reguler.

    Jika Anda mengubah properti tabel dari INDEX_ALL='Y' menjadi INDEX_ALL='N', semua indeks reguler dihapus, kecuali indeks pada kolom kunci primer.

Catatan

  • Untuk tabel XUANWU, fitur indeks kolom penuh hanya dapat dikonfigurasi saat pembuatan tabel. Untuk menonaktifkan pengindeksan kolom penuh, Anda harus menghapus indeks secara manual dengan menjalankan pernyataan penghapusan indeks.

  • Jika INDEX_ALL='Y', menjalankan pernyataan Data Definition Language (DDL) untuk menghapus indeks reguler secara otomatis mengubah properti dari INDEX_ALL='Y' menjadi INDEX_ALL='N'. Operasi ini hanya menghapus indeks reguler target dan tidak memengaruhi indeks reguler lainnya.

  • Ketika properti tabel adalah INDEX_ALL='N', pernyataan SHOW CREATE TABLE mungkin tidak secara eksplisit menampilkan properti sebagai INDEX_ALL='N'. Namun, properti yang berlaku tetap INDEX_ALL='N'.

Contoh

  • Asumsikan tabel customer memiliki INDEX_ALL='Y'. Jalankan pernyataan berikut untuk mengubah properti tabel menjadi INDEX_ALL='N'.

    ALTER TABLE adb_demo.customer INDEX_ALL = 'N';

    Setelah pernyataan dijalankan, indeks reguler pada semua kolom non-kunci primer, seperti customer_name, city_name, dan sex, dihapus.

  • Asumsikan tabel customer memiliki INDEX_ALL='N', dan kolom customer_id, phone_num, dan login_time sudah memiliki indeks. Jalankan pernyataan berikut untuk mengubah properti tabel menjadi INDEX_ALL='Y'.

    ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';

    Setelah pernyataan dijalankan, indeks reguler dibuat untuk kolom yang belum memilikinya, seperti customer_name, city_name, dan sex.

Menambahkan indeks JSON

Catatan

  • Untuk tabel XUANWU_V2 (partisi dan non-partisi), indeks JSON atau indeks Array JSON yang Anda buat langsung berlaku tanpa memerlukan pekerjaan BUILD.

  • Untuk tabel XUANWU non-partisi, indeks JSON atau indeks Array JSON yang Anda buat hanya berlaku setelah pekerjaan BUILD selesai.

  • Untuk tabel XUANWU partisi, Anda harus secara manual memaksa pekerjaan BUILD seluruh tabel. Indeks JSON atau indeks Array JSON yang Anda buat hanya berlaku setelah pekerjaan BUILD selesai.

Indeks JSON

Sintaks

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')

Deskripsi parameter

  • column_name: Membuat indeks pada kolom JSON. Kolom harus bertipe JSON.

  • column_name->'$.json_path': Membuat indeks pada kunci properti tertentu dalam objek JSON. Kolom yang ditentukan oleh column_name harus bertipe JSON. Untuk informasi lebih lanjut, lihat Indeks JSON.

    Penting
    • Hanya kluster AnalyticDB for MySQL versi V3.1.6.8 atau lebih baru yang mendukung parameter column_name->'$.json_path.

    • Jika kolom JSON sudah memiliki indeks, Anda harus menghapus indeks untuk kolom JSON tersebut sebelum dapat membuat indeks untuk kunci properti kolom JSON tersebut.

Contoh

Asumsikan skema tabel dan pernyataan INSERT adalah sebagai berikut.

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}'));

Buat indeks JSON pada properti a dari kolom vj di tabel json_test.

ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');

Indeks Array JSON

Sintaks

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')

Deskripsi parameter

column_name->'$[*]': column_name adalah kolom untuk indeks Array JSON. Misalnya, vj->'$[*]' membuat indeks Array JSON pada kolom vj.

Contoh

Asumsikan skema tabel dan pernyataan INSERT adalah sebagai berikut.

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');

Buat indeks Array JSON pada kolom vj di tabel json_test.

ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');

Menghapus indeks atau indeks JSON

Sintaks

ALTER TABLE db_name.table_name DROP KEY index_name

Deskripsi parameter

index_name: Nama indeks reguler. Anda dapat menjalankan SHOW INDEX FROM db_name.table_name; untuk menemukan index_name.

Contoh

  • Hapus indeks bernama age_idx dari tabel customer.

    ALTER TABLE adb_demo.customer DROP KEY age_idx;
  • Hapus indeks Array JSON bernama index_vj dari tabel json_test.

    ALTER TABLE adb_demo.customer DROP KEY index_vj;

Menambahkan indeks terkluster

Sintaks

ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])

Catatan

  • Secara default, indeks terkluster diurutkan secara ascending (ASC) dan cocok untuk kueri yang diurutkan secara ascending. Jika kueri Anda diurutkan secara descending, atur indeks terkluster ke descending (DESC) saat membuat tabel.

  • Sebuah tabel hanya dapat memiliki satu indeks terkluster. Anda tidak dapat menambahkan indeks terkluster lain jika sudah ada.

  • Setelah indeks terkluster ditambahkan, Anda harus memicu dan menyelesaikan pekerjaan BUILD agar indeks terkluster berlaku. Anda dapat menjalankan pernyataan SHOW CREATE TABLE db_name.table_name; untuk menentukan apakah indeks terkluster telah berlaku.

Contoh

Anda dapat menambahkan indeks terkluster ke kolom customer_id di tabel customer.

ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);

Menghapus indeks terkluster

Sintaks

ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name

Deskripsi parameter

index_name: Nama indeks terkluster. Anda dapat menjalankan 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;

Menambahkan indeks teks penuh

Prasyarat

Kluster AnalyticDB for MySQL versi V3.1.4.9 atau lebih baru telah dibuat.

Catatan

Sintaks

ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]

Deskripsi parameter

  • column_name: Kolom tempat membuat indeks teks penuh. Kolom harus bertipe VARCHAR.

  • index_option: Opsional. Menentukan pemisah kata dan kamus kustom untuk indeks teks penuh.

    • WITH ANALYZER analyzer_name: menentukan alat analisis yang digunakan untuk indeks teks penuh. Untuk informasi lebih lanjut tentang alat analisis yang didukung oleh AnalyticDB for MySQL, lihat Alat analisis untuk indeks teks penuh.

    • WITH DICT tbl_dict_name: menentukan kamus kustom yang digunakan untuk indeks teks penuh. Untuk informasi lebih lanjut tentang kamus kustom yang didukung oleh AnalyticDB for MySQL, lihat Kamus kustom untuk indeks teks penuh.

Catatan

Indeks teks penuh yang Anda buat hanya berlaku setelah pekerjaan BUILD dipicu ulang dan selesai.

Contoh

Tambahkan indeks teks penuh ke kolom home_address dari tabel customer.

ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;

Menghapus indeks teks penuh

Sintaks

ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name

Deskripsi parameter

  • column_name: Nama kolom tempat membuat indeks teks penuh. Kolom harus bertipe VARCHAR.

  • index_option: Alat analisis dan kamus kustom yang digunakan untuk indeks teks penuh. Parameter ini opsional.

    • WITH ANALYZER analyzer_name: menentukan alat analisis yang digunakan untuk indeks teks penuh. Untuk informasi lebih lanjut tentang alat analisis yang didukung oleh AnalyticDB for MySQL, lihat Alat analisis untuk indeks teks penuh.

    • WITH DICT tbl_dict_name: menentukan kamus kustom yang digunakan untuk indeks teks penuh. Untuk informasi lebih lanjut tentang kamus kustom yang didukung oleh AnalyticDB for MySQL, lihat Kamus kustom untuk indeks teks penuh.

Contoh

Hapus indeks teks penuh fidx_k dari tabel customer.

ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;

Untuk informasi lebih lanjut, lihat Membuat indeks teks penuh.

Menambahkan indeks vektor

Prasyarat

Kluster AnalyticDB for MySQL versi V3.1.4.0 atau lebih baru telah dibuat.

Catatan
  • Untuk menggunakan fitur pencarian vektor, kami merekomendasikan penggunaan versi minor berikut: 3.1.5.16, 3.1.6.8, 3.1.8.6, dan versi lebih baru.

  • Jika kluster Anda bukan versi di atas, kami merekomendasikan agar Anda mengatur parameter CSTORE_PROJECT_PUSH_DOWN dan CSTORE_PPD_TOP_N_ENABLE menjadi false sebelum menggunakan fitur pencarian vektor.

  • Untuk informasi tentang cara menanyakan versi minor kluster AnalyticDB for MySQL, lihat Bagaimana cara menanyakan versi kluster AnalyticDB for MySQL? Untuk memperbarui versi minor kluster, hubungi dukungan teknis.

Sintaks

ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]

Deskripsi parameter

  • index_name: nama indeks. Untuk informasi tentang konvensi penamaan indeks, lihat bagian "Batasan penamaan" dalam topik Batasan.

  • column_name: Nama kolom vektor. Tipe kolom harus array <float>, array <byte>, atau array <smallint>.

  • algorithm: algoritma yang digunakan untuk menghitung jarak vektor. Tetapkan nilainya ke HNSW_PQ.

  • distancemeasure: rumus yang digunakan untuk menghitung jarak vektor. Tetapkan nilainya ke SquaredL2. Rumus perhitungan SquaredL2: (x1 - y1)<sup>2</sup> + (x2 - y2)<sup>2</sup> + ...(xn - yn)<sup>2</sup>.

Contoh

Asumsikan Anda memiliki tabel bernama vector yang dibuat menggunakan pernyataan berikut.

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);

Buat indeks vektor pada kolom float_feature dan short_feature.

ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);

Menambahkan kunci asing

Prasyarat

Kluster AnalyticDB for MySQL harus menjalankan versi kernel 3.1.10 atau lebih baru.

Catatan

Untuk melihat dan memperbarui versi minor kluster AnalyticDB for MySQL, masuk ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information.

Sintaks

ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)

Deskripsi parameter

  • db_name.table_name: Tabel tempat Anda ingin menambahkan kunci asing.

  • symbol: Opsional. Nama kendala kunci asing, yang harus unik dalam tabel. Jika tidak ditentukan, resolver secara otomatis menambahkan akhiran _fk ke nama kolom kunci asing sebagai nama kendala.

  • fk_column_name: Menentukan kolom kunci asing. Kolom kunci asing harus didefinisikan dalam pernyataan CREATE TABLE.

  • pk_table_name: Menentukan nama tabel utama. Tabel utama harus sudah ada.

  • pk_column_name: Menentukan kolom kendala kunci asing. Kolom ini harus ada dan merupakan kolom kunci primer dari tabel utama.

Catatan

  • Setiap tabel dapat memiliki beberapa indeks kunci asing.

  • Indeks kunci asing komposit, yang terdiri dari beberapa kolom, tidak didukung. Misalnya, FOREIGN KEY (sr_item_sk, sr_ticket_number) REFERENCES store_sales(ss_item_sk,d_date_sk) tidak didukung.

  • AnalyticDB for MySQL tidak melakukan pemeriksaan kendala data. Anda harus memastikan hubungan kendala data antara kunci primer tabel utama dan kunci asing tabel detail.

  • Anda tidak dapat membuat kendala kunci asing pada tabel eksternal.

Contoh

Asumsikan Anda memiliki dua tabel, item dan store_sales, yang dibuat menggunakan pernyataan berikut.

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)
);

Tambahkan kunci asing ss_item_sk ke tabel store_sales dan kaitkan dengan kunci i_item_sk dari tabel item.

ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);

Untuk informasi lebih lanjut, lihat Menghilangkan join yang tidak perlu menggunakan kendala kunci primer dan kunci asing.

Menghapus kunci asing

Sintaks

ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol

Contoh

ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;

Partisi

Mengubah siklus hidup partisi

Sintaks

ALTER TABLE db_name.table_name PARTITIONS N

Catatan

  • Untuk kluster dengan versi kernel 3.2.4.1 atau lebih baru, Anda dapat menghapus manajemen siklus hidup partisi dengan mengatur parameter LIFECYCLE N menjadi 0.

  • Setelah Anda mengubah siklus hidup partisi, tugas BUILD harus dipicu dan diselesaikan agar siklus hidup baru berlaku. Anda dapat menjalankan pernyataan SHOW CREATE TABLE db_name.table_name; untuk memeriksa apakah siklus hidup baru telah berlaku.

Contoh 1

Hapus siklus hidup dari tabel customer.

ALTER TABLE customer PARTITIONS 0;

Contoh 2

Ubah siklus hidup tabel customer dari 30 menjadi 40.

ALTER TABLE customer PARTITIONS 40;

Menghapus partisi

Catatan

Pernyataan ALTER TABLE DROP PARTITION setara dengan pernyataan <a baseurl="t1854474_v6_2_0.xdita" data-node="2138850" data-root="56091" data-tag="xref" href="t1854487.xdita#" id="0a822ac288leo">TRUNCATE TABLE</a> PARTITION.

Sintaks

ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)

Catatan

Setelah Anda menghapus partisi, data dalam partisi tersebut juga dihapus dan tidak dapat dipulihkan. Lakukan operasi ini dengan hati-hati.

Contoh

  • Hapus partisi 20241220 dari tabel customer.

    ALTER TABLE adb_demo.customer DROP PARTITION (20241220);
  • Hapus partisi 20241218 dan 20241219 dari tabel customer.

    ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);

Kebijakan Penyimpanan

Mengubah kebijakan penyimpanan bertingkat

Prasyarat

  • Kluster adalah Edisi Perusahaan, Edisi Dasar, Edisi Data Lakehouse, atau Edisi Gudang Data (mode Elastis).

  • Versi kernel:

    • Jika mesin tabel adalah XUANWU, tidak ada batasan pada versi kernel kluster.

    • Jika mesin tabel adalah XUANWU_V2, versi kernel kluster harus memenuhi salah satu kondisi berikut:

      • 3.2.2.15 atau lebih baru.

      • 3.2.3.13 atau lebih baru.

      • 3.2.4.9 atau lebih baru.

      • 3.2.5.3 atau lebih baru.

      Catatan

      Untuk melihat dan memperbarui versi minor kluster AnalyticDB for MySQL, masuk ke Konsol AnalyticDB for MySQL dan buka bagian Configuration Information pada halaman Cluster Information.

  • Jika mesin tabel adalah XUANWU_V2, tugas terjadwal untuk memindahkan data antara penyimpanan panas dan dingin harus diaktifkan pada kluster:

    • Periksa apakah tugas diaktifkan: SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;. Jika perintah mengembalikan FALSE, tugas dinonaktifkan dan Anda harus mengaktifkannya. Jika terjadi kesalahan, parameter tidak diatur, dan nilai default adalah TRUE.

    • Aktifkan tugas: SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;.

Sintaks

ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}

Catatan penggunaan

Setelah Anda mengubah kebijakan penyimpanan bertingkat untuk data panas dan dingin, kebijakan baru hanya berlaku setelah pekerjaan BUILD untuk tabel dipicu dan diselesaikan. Secara default, pekerjaan ini berjalan secara otomatis di latar belakang pada interval tertentu. Sebelum pekerjaan BUILD selesai, wajar jika jumlah partisi panas yang dikembalikan oleh information_schema.table_usage tidak sesuai dengan kebijakan penyimpanan yang ditentukan. Anda dapat menjalankan SHOW CREATE TABLE db_name.table_name; untuk memeriksa apakah kebijakan penyimpanan baru telah berlaku.

Contoh

  • Ubah kebijakan penyimpanan tabel customer menjadi COLD.

    ALTER TABLE customer storage_policy = 'COLD';
  • Ubah kebijakan penyimpanan tabel customer menjadi HOT.

    ALTER TABLE customer storage_policy = 'HOT';
  • Ubah kebijakan penyimpanan tabel customer menjadi MIXED dan atur jumlah partisi panas menjadi 10.

    ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;

FAQ

Apakah saya dapat mengubah urutan kolom?

Anda tidak dapat mengubah urutan kolom.

Bagaimana cara mengubah kolom VARCHAR menjadi LONGTEXT?

AnalyticDB for MySQL mendukung tipe string varchar dan binary. Tipe varchar di AnalyticDB for MySQL sesuai dengan tipe char, varchar, text, mediumtext, dan longtext di MySQL. Oleh karena itu, Anda tidak perlu mengubah kolom VARCHAR menjadi LONGTEXT.

Jika saya menambahkan kolom auto-increment ke tabel yang sudah ada dengan data, apakah kolom tersebut akan diisi otomatis untuk data historis?

Tidak, tidak akan. Saat Anda menambahkan kolom auto-increment ke tabel yang sudah ada dan berisi data, hanya data yang baru ditulis yang akan memiliki nilai auto-increment. Untuk mengisi kolom auto-increment untuk data historis, Anda harus membuat tabel baru yang mencakup kolom auto-increment tersebut, lalu migrasikan data ke tabel baru tersebut.

Apakah saya dapat mengubah kunci distribusi atau kunci partisi?

AnalyticDB for MySQL tidak mendukung penambahan, penghapusan, atau perubahan kunci distribusi atau kunci partisi. Jika bisnis Anda memerlukan perubahan kunci distribusi atau partisi, Anda dapat menggunakan solusi berikut.

Asumsikan Anda memiliki tabel bernama `order` dan perlu mengubah kunci distribusinya dari `order_id` menjadi `customer_id`. Anda dapat melakukan langkah-langkah berikut:

  1. Buat tabel sementara bernama `order_auto_opt_v1` dengan `customer_id` sebagai kunci distribusi.

    CREATE TABLE order_auto_opt_v1 (
      order_id bigint NOT NULL COMMENT 'ID Pesanan',
      customer_id bigint NOT NULL COMMENT 'ID Pelanggan',
      customer_name varchar NOT NULL COMMENT 'Nama pelanggan',
      order_time timestamp NOT NULL COMMENT 'Waktu pesanan',
      --Bidang lain dihilangkan.
      PRIMARY KEY (order_id,customer_id,order_time) --Kunci distribusi customer_id dan kunci partisi order_time harus ditambahkan ke kunci primer.
    )
    DISTRIBUTED BY HASH(customer_id) --Ubah kunci distribusi dari order_id menjadi customer_id.
    PARTITION BY VALUE(DATE_FORMAT(order_time, '%Y%m%d')) LIFECYCLE 90 --Pengaturan subpartisi tetap tidak berubah.
    COMMENT 'Tabel informasi pesanan';
  2. Gunakan INSERT OVERWRITE SELECT untuk mengimpor data dari tabel sumber ke tabel sementara. Untuk informasi lebih lanjut, lihat INSERT OVERWRITE SELECT.

    INSERT OVERWRITE order_auto_opt_v1
    SELECT * FROM order;
  3. Periksa apakah kunci distribusi sesuai. Setelah impor data selesai, periksa apakah kunci distribusi baru menyebabkan kesenjangan data. Untuk informasi lebih lanjut, lihat Diagnostik penyimpanan.

  4. Gunakan RENAME TABLE <nama_tabel_sumber> to <nama_tabel_sumber_baru>; untuk mengganti nama tabel sumber.

    RENAME TABLE order to order_backup; --Setelah impor data selesai, ganti nama tabel sumber untuk cadangan.
  5. Gunakan RENAME TABLE <nama_tabel_sementara> to <nama_tabel_sumber>; untuk mengganti nama tabel sementara menjadi nama tabel sumber.

    RENAME TABLE order_auto_opt_v1 to order;

Apakah saya dapat menambah atau mengubah kunci primer?

  • Anda tidak dapat menambah atau menghapus kunci primer. Anda tidak dapat mengubah tabel tanpa kunci primer menjadi tabel dengan kunci primer, atau sebaliknya.

  • Anda tidak dapat menambah atau menghapus kolom kunci primer.

  • Anda tidak dapat mengubah nama kolom kunci primer.

  • Anda tidak dapat mengubah tipe data kolom kunci primer.

Mengapa perubahan saya pada siklus hidup atau kebijakan penyimpanan bertingkat tidak berlaku?

Setelah Anda memodifikasi siklus hidup atau kebijakan penyimpanan bertingkat, kebijakan baru hanya berlaku setelah pekerjaan BUILD baru dipicu dan diselesaikan untuk tabel tersebut.

Ketika Anda dapat menanyakan siklus hidup atau kebijakan penyimpanan baru dengan menjalankan SHOW CREATE TABLE db_name.table_name;, itu menunjukkan bahwa pengaturan baru telah berlaku.

Kesalahan umum

syntax error, error in :'DISTRIBUTE BY HASH(`id`) PARTITION BY VAL

Anda tidak dapat memodifikasi kunci primer, kunci partisi, atau kunci distribusi tabel setelah tabel dibuat. Untuk melakukan perubahan tersebut, buat tabel baru dan migrasikan data.

Do not allow concurrent add cluster/zorder index task

Pesan kesalahan lengkap mungkin seperti ini: `Do not allow concurrent add cluster/zorder index task , which in progress : {"clusterColumnIds":[2],"clusterColumns":["phone_num"],"clusterIndexName":"index1","indexOptions":"ASC","type":"ADD_CLUSTERING_KEY"}`.

Penyebab: Sebuah tabel hanya dapat memiliki satu indeks terkluster. Anda telah menjalankan ALTER TABLE ... ADD CLUSTERED KEY untuk menambahkan indeks terkluster, tetapi indeks tersebut belum berlaku karena pekerjaan BUILD belum dipicu atau belum selesai. Jika Anda mencoba menambahkan indeks terkluster lain pada saat ini, kesalahan ini terjadi.

Solusi: Setelah Anda menambahkan indeks terkluster, Anda harus menunggu pekerjaan BUILD dipicu secara otomatis, atau Anda dapat memaksa memicu pekerjaan BUILD secara manual. Indeks terkluster yang ditambahkan hanya berlaku setelah pekerjaan BUILD selesai. Setelah indeks terkluster baru berlaku, Anda dapat mengubahnya dengan menghapus indeks asli lalu menambahkan yang baru.

Anda dapat menjalankan SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10; untuk melihat status pekerjaan BUILD.