全部产品
Search
文档中心

PolarDB:ALTER TABLE...EXCHANGE PARTITION

更新时间:Jul 02, 2025

Perintah ALTER TABLE...EXCHANGE PARTITION menukar tabel yang ada dengan partisi atau subpartisi.

Ikhtisar

Jika Anda berencana menambahkan sejumlah besar data ke tabel yang dipartisi, Anda dapat menggunakan perintah ALTER TABLE...EXCHANGE PARTITION untuk mentransfer beban data dalam jumlah besar. Perintah ini juga dapat digunakan untuk menghapus data yang sudah usang atau berlebihan dari penyimpanan.

Perintah ALTER TABLE...EXCHANGE PARTITION memiliki dua bentuk:
  • Bentuk pertama menukar tabel dengan partisi:
    ALTER TABLE target_table 
      EXCHANGE PARTITION target_partition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];
  • Bentuk kedua menukar tabel dengan subpartisi:
    ALTER TABLE target_table 
      EXCHANGE SUBPARTITION target_subpartition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];
Perintah ALTER TABLE...EXCHANGE PARTITION tidak membedakan antara partisi dan subpartisi:
  • Anda dapat menukar partisi menggunakan klausa EXCHANGE PARTITION atau EXCHANGE SUBPARTITION.
  • Anda dapat menukar subpartisi menggunakan klausa EXCHANGE PARTITION atau EXCHANGE SUBPARTITION.

Deskripsi

Setelah perintah ALTER TABLE...EXCHANGE PARTITION selesai, data akan ditukar. Data yang awalnya berada di partisi target akan berada di tabel sumber, dan data yang awalnya berada di tabel sumber akan berada di partisi target.

Struktur tabel sumber harus sesuai dengan struktur tabel target (kedua tabel harus memiliki kolom dan tipe data yang cocok). Data yang terkandung dalam tabel harus mematuhi batasan partisi.

PolarDB for PostgreSQL (Kompatibel dengan Oracle) menerima klausa WITHOUT VALIDATION, tetapi mengabaikannya. Tabel baru selalu divalidasi.

Anda harus memiliki tabel untuk memanggil ALTER TABLE...EXCHANGE PARTITION atau ALTER TABLE...EXCHANGE SUBPARTITION pada tabel tersebut.

Parameter

ParameterDeskripsi
target_tableNama (secara opsional memenuhi skema) dari tabel tempat partisi berada.
target_partitionNama partisi atau subpartisi yang akan diganti.
source_tableNama tabel yang akan menggantikan target_partition.

Contoh - menukar tabel dengan partisi

Contoh berikut menunjukkan penukaran tabel dengan partisi (americas) dari tabel sales. Anda dapat menjalankan perintah berikut untuk membuat tabel sales:
CREATE TABLE sales
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date    date,
  amount  number
)
PARTITION BY LIST(country)
(
  PARTITION europe VALUES('FRANCE', 'ITALY'),
  PARTITION asia VALUES('INDIA', 'PAKISTAN'),
  PARTITION americas VALUES('US', 'CANADA')
);
Jalankan perintah berikut untuk menambahkan data sampel ke tabel sales:
INSERT INTO sales VALUES
  (40, '9519b', 'US', '12-Apr-2012', '145000'),
  (10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
  (20, '3788a', 'INDIA', '01-Mar-2012', '75000'),
  (20, '3788a', 'PAKISTAN', '04-Jun-2012', '37500'),
  (10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
  (10, '9519a', 'FRANCE', '18-Aug-2012', '650000'),
  (10, '9519b', 'FRANCE', '18-Aug-2012', '650000'),
  (20, '3788b', 'INDIA', '21-Sept-2012', '5090'),
  (20, '4519a', 'INDIA', '18-Oct-2012', '650000'),
  (20, '4519b', 'INDIA', '2-Dec-2012', '5090');
Meminta tabel sales menunjukkan bahwa hanya satu baris yang berada di partisi americas:
acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid   | dept_no| part_no | country |      date     | amount 
---------------+--------+---------+---------+-------------------+-----------
 sales_europe  |      10| 4519b   | FRANCE  | 17-JAN-12 00:00:00|      45000
 sales_europe  |      10| 9519b   | ITALY   | 07-JUL-12 00:00:00|      15000
 sales_europe  |      10| 9519a   | FRANCE  | 18-AUG-12 00:00:00|     650000
 sales_europe  |      10| 9519b   | FRANCE  | 18-AUG-12 00:00:00|     650000
 sales_asia    |      20| 3788a   | INDIA   | 01-MAR-12 00:00:00|      75000
 sales_asia    |      20| 3788a   | PAKISTAN| 04-JUN-12 00:00:00|      37500
 sales_asia    |      20| 3788b   | INDIA   | 21-SEP-12 00:00:00|       5090
 sales_asia    |      20| 4519a   | INDIA   | 18-OCT-12 00:00:00|     650000
 sales_asia    |      20| 4519b   | INDIA   | 02-DEC-12 00:00:00|       5090
 sales_americas|      40| 9519b   | US      | 12-APR-12 00:00:00|     145000
(10 rows)
Perintah berikut membuat tabel (n_america) yang sesuai dengan definisi tabel sales:
CREATE TABLE n_america
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date    date,
  amount  number
);
Perintah berikut menambahkan data ke tabel n_america. Data tersebut sesuai dengan aturan partisi dari partisi americas:
INSERT INTO n_america VALUES
  (40, '9519b', 'US', '12-Apr-2012', '145000'),
  (40, '4577b', 'US', '11-Nov-2012', '25000'),
  (30, '7588b', 'CANADA', '14-Dec-2012', '50000'),
  (30, '9519b', 'CANADA', '01-Feb-2012', '75000'),
  (30, '4519b', 'CANADA', '08-Apr-2012', '120000'),
  (40, '3788a', 'US', '12-May-2012', '4950'),
  (40, '4788a', 'US', '23-Sept-2012', '4950'),
  (40, '4788b', 'US', '09-Oct-2012', '15000');
Perintah berikut menukar tabel ke dalam tabel yang dipartisi:
ALTER TABLE sales 
  EXCHANGE PARTITION americas 
  WITH TABLE n_america; 
Meminta tabel sales menunjukkan bahwa isi tabel n_america telah ditukar dengan isi partisi americas:
acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid   | dept_no| part_no | country |        date        | amount 
---------------+--------+--------+----------+--------------------+-----------
 sales_europe  |      10| 4519b   | FRANCE  | 17-JAN-12 00:00:00 |      45000
 sales_europe  |      10| 9519b   | ITALY   | 07-JUL-12 00:00:00 |      15000
 sales_europe  |      10| 9519a   | FRANCE  | 18-AUG-12 00:00:00 |     650000
 sales_europe  |      10| 9519b   | FRANCE  | 18-AUG-12 00:00:00 |     650000
 sales_asia    |      20| 3788a   | INDIA   | 01-MAR-12 00:00:00 |      75000
 sales_asia    |      20| 3788a   | PAKISTAN| 04-JUN-12 00:00:00 |      37500
 sales_asia    |      20| 3788b   | INDIA   | 21-SEP-12 00:00:00 |       5090
 sales_asia    |      20| 4519a   | INDIA   | 18-OCT-12 00:00:00 |     650000
 sales_asia    |      20| 4519b   | INDIA   | 02-DEC-12 00:00:00 |       5090
 sales_americas|      40| 9519b   | US      | 12-APR-12 00:00:00 |     145000
 sales_americas|      40| 4577b   | US      | 11-NOV-12 00:00:00 |      25000
 sales_americas|      30| 7588b   | CANADA  | 14-DEC-12 00:00:00 |      50000
 sales_americas|      30| 9519b   | CANADA  | 01-FEB-12 00:00:00 |      75000
 sales_americas|      30| 4519b   | CANADA  | 08-APR-12 00:00:00 |     120000
 sales_americas|      40| 3788a   | US      | 12-MAY-12 00:00:00 |       4950
 sales_americas|      40| 4788a   | US      | 23-SEP-12 00:00:00 |       4950
 sales_americas|      40| 4788b   | US      | 09-OCT-12 00:00:00 |      15000
(17 rows)
Meminta tabel n_america menunjukkan bahwa baris yang sebelumnya disimpan di partisi americas telah dipindahkan ke tabel n_america:
acctg=# SELECT tableoid::regclass, * FROM n_america;
 tableoid  | dept_no | part_no | country |        date        | amount 
-----------+---------+---------+---------+--------------------+------------
 n_america |      40 | 9519b   | US      | 12-APR-12 00:00:00 |     145000
(1 row)