All Products
Search
Document Center

PolarDB:Ubah tabel partisi

Last Updated:Mar 29, 2026

Gunakan ALTER TABLE untuk mengonversi tabel antara tiga strategi partisi: umum (tidak dipartisi), partisi range, dan tabel partisi interval range.

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  • Kluster PolarDB for MySQL 8.0 dengan versi revisi 8.0.2.2.0 atau lebih baru

Untuk memeriksa versi revisi Anda, lihat Kueri versi engine.

Cara kerja

Tabel partisi interval range menggunakan titik transisi untuk memisahkan partisi range yang didefinisikan secara eksplisit dari partisi interval yang dikelola secara otomatis. Semua data hingga titik transisi dimasukkan ke dalam partisi range bernama. Data di luar titik tersebut memicu pembuatan partisi otomatis sesuai interval yang ditentukan—tanpa perlu menjalankan ADD PARTITION secara manual.

Saat Anda menghapus definisi interval dari sebuah tabel, semua partisi interval yang ada berubah menjadi partisi range standar.

Aturan pengalihan

KonversiDidukungMetode
Tabel umum → tabel partisi interval rangeYaALTER TABLE ... PARTITION BY
Tabel partisi interval range → tabel umumTidak
Tabel partisi range → tabel partisi interval rangeYaALTER TABLE ... PARTITION BY (8.0.2.2.0+) atau SET INTERVAL (8.0.2.2.1+)
Tabel partisi interval range → tabel partisi rangeYaALTER TABLE ... PARTITION BY (8.0.2.2.0+) atau SET INTERVAL() (8.0.2.2.1+)
Setelah dikonversi menjadi tabel partisi interval range, database akan membuat partisi baru secara otomatis ketika data dimasukkan melewati titik transisi. Anda tidak dapat menambahkan partisi secara eksplisit ke tabel partisi interval range.

Sintaksis

Sintaksis 1 — mendefinisikan ulang skema partisi lengkap:

ALTER TABLE table_name partition_options;

Di mana partition_options adalah:

PARTITION BY
    { RANGE{(expr) | COLUMNS(column_list)} }
    { INTERVAL(type, expr) | INTERVAL(expr) }
    [(partition_definition [, partition_definition] ...)]

Di mana definisi_partisi adalah:

PARTITION partition_name
        [VALUES LESS THAN {expr | MAXVALUE}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

Sintaksis 2 — mengaktifkan/menonaktifkan interval pada tabel partisi range yang sudah ada (memerlukan versi 8.0.2.2.1 atau lebih baru):

ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };

Untuk menonaktifkan partisi interval dan kembali ke tabel partisi range, panggil SET INTERVAL() tanpa argumen.

Parameter

ParameterDeskripsi
table_nameNama tabel
RANGE(expr)Ekspresi partisi. Harus menghasilkan nilai INT; tipe string tidak didukung
column_listDaftar kolom untuk RANGE COLUMNS(); ekspresi tidak didukung
INTERVAL(type)Jenis interval waktu. Nilai yang didukung: YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND. Jika dihilangkan, tipe numerik digunakan
INTERVAL(expr)Nilai interval. Ketika type adalah SECOND, nilainya harus 60 atau lebih besar
MAXVALUENilai maksimum partisi
engine_nameNama storage engine

Mengonversi tabel umum menjadi tabel partisi interval range

Definisikan partisi range awal untuk menetapkan titik transisi. Data yang dimasukkan melewati batas tersebut akan secara otomatis membuat partisi bulanan (atau interval lainnya).

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
);

-- Konversi menjadi tabel partisi interval range.
-- Partisi p0 menyimpan data sebelum 2021-10-01 (titik transisi).
-- Data mulai 2021-10-01 dan seterusnya membuat partisi bulanan secara otomatis.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Mengonversi tabel partisi range menjadi tabel partisi interval range

Tersedia dua metode. Keduanya menambahkan interval ke tabel partisi range yang sudah ada.

Metode 1: Mendefinisikan ulang skema partisi (memerlukan versi 8.0.2.2.0 atau lebih baru)

Gunakan metode ini untuk mengubah kunci partisi dan interval dalam satu pernyataan.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Mendefinisikan ulang skema partisi: ganti kunci ke orderdate dan tambahkan interval bulanan.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Metode 2: Atur interval pada tabel partisi range yang sudah ada (memerlukan versi 8.0.2.2.1 atau lebih baru)

Gunakan metode ini jika tabel sudah dipartisi berdasarkan kunci yang benar dan Anda hanya perlu mengaktifkan partisi interval.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

-- Aktifkan partisi interval dengan interval bulanan.
ALTER TABLE orders SET INTERVAL(MONTH, 1);

Mengonversi tabel partisi interval range menjadi tabel partisi range

Menghapus definisi interval akan mengonversi semua partisi interval yang ada menjadi partisi range bernama.

Metode 1: Mendefinisikan ulang skema partisi (memerlukan versi 8.0.2.2.0 atau lebih baru)

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Mendefinisikan ulang tanpa klausa INTERVAL untuk mengonversi ke tabel partisi range.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

Metode 2: Hapus interval (memerlukan versi 8.0.2.2.1 atau lebih baru)

Panggil SET INTERVAL() tanpa argumen untuk menonaktifkan partisi interval. Partisi interval yang ada tetap dipertahankan sebagai partisi range.

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey  BIGINT NOT NULL,
  orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
  PARTITION p0 VALUES LESS THAN(10000000)
);

-- Nonaktifkan partisi interval. Partisi interval yang ada dipertahankan sebagai partisi range.
ALTER TABLE orders SET INTERVAL(); /* Ubah tabel partisi interval range menjadi tabel partisi range tanpa menentukan jenis dan nilai interval. */