全部产品
Search
文档中心

:Menangani nilai liar dalam tabel terpartisi daftar atau rentang

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menangani nilai liar dalam tabel terpartisi daftar atau rentang.

Partisi atau subpartisi DEFAULT atau MAXVALUE menangkap baris yang tidak sesuai dengan aturan partisi lainnya yang didefinisikan untuk sebuah tabel.

Definisikan partisi DEFAULT

Partisi DEFAULT menangkap baris yang tidak cocok dengan partisi lain dalam tabel terpartisi daftar atau subpartisi daftar. Jika Anda tidak menyertakan aturan DEFAULT, baris yang berisi nilai yang tidak sesuai dengan aturan partisi akan menyebabkan kesalahan. Setiap partisi dalam tabel terpartisi daftar atau subpartisi dalam tabel subpartisi daftar dapat memiliki aturan DEFAULT sendiri.

Aturan DEFAULT memiliki sintaksis berikut:
PARTITION nama_partisi VALUES (DEFAULT)

Di mana nama_partisi menentukan nama partisi atau subpartisi yang digunakan untuk menyimpan baris yang tidak sesuai dengan aturan partisi yang ditentukan untuk partisi lainnya.

Pada contoh terakhir, tabel terpartisi daftar dibuat. Server menentukan partisi mana di tabel terpartisi ini untuk menyimpan data berdasarkan nilai kolom negara. Jika Anda mencoba menambahkan baris di mana nilai kolom negara tidak terdaftar dalam aturan, PolarDB melaporkan kesalahan:
acctg=# INSERT INTO sales VALUES
acctg-#   (40, '3000x', 'IRELAND', '01-Mar-2012', '45000');
ERROR:  inserted partition key does not map to any partition
Pada contoh berikut, tabel yang sama dibuat dan partisi DEFAULT ditambahkan ke tabel. Aturan partisi digunakan untuk menentukan nilai yang disimpan di partisi eropa, asia, atau amerika. Jika nilai dalam baris tidak ditentukan dalam aturan, server menyimpan baris tersebut di partisi lainnya.
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'),
  PARTITION others VALUES (DEFAULT)
);
Untuk menguji partisi DEFAULT, tambahkan baris di mana nilai kolom negara tidak sesuai dengan negara yang ditentukan dalam aturan partisi:
INSERT INTO sales VALUES
  (40, '3000x', 'IRELAND', '01-Mar-2012', '45000');
Anda dapat memeriksa tabel penjualan untuk melihat apakah baris yang sebelumnya ditolak sekarang disimpan di partisi sales_others:
acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid    | dept_no | part_no | country  |        date        |  amount 
----------------+---------+---------+----------+--------------------+--------
 sales_others   |      40 | 3000x   | IRELAND  | 01-MAR-12 00:00:00 |   45000
(18 rows)
Catatan bahwa PolarDB tidak dapat menetapkan ulang isi partisi atau subpartisi DEFAULT.
  • Anda tidak dapat menjalankan perintah ALTER TABLE...ADD PARTITION untuk menambahkan partisi ke tabel yang memiliki aturan DEFAULT. Namun, Anda dapat menjalankan perintah ALTER TABLE...SPLIT PARTITION untuk membagi partisi yang ada.
  • Anda tidak dapat menjalankan perintah ALTER TABLE...ADD SUBPARTITION untuk menambahkan subpartisi ke tabel yang memiliki aturan DEFAULT. Namun, Anda dapat menjalankan perintah ALTER TABLE...SPLIT SUBPARTITION untuk membagi subpartisi yang ada.

Definisikan partisi MAXVALUE

Partisi atau subpartisi MAXVALUE menangkap baris yang tidak cocok dengan partisi lain dalam tabel terpartisi rentang atau subpartisi rentang. Jika Anda tidak menyertakan aturan MAXVALUE, kesalahan terjadi jika baris berisi nilai yang melebihi batas atas yang ditentukan oleh aturan partisi. Setiap partisi atau subpartisi dapat memiliki partisi MAXVALUE sendiri.

Catatan bahwa PolarDB tidak dapat menetapkan ulang isi partisi atau subpartisi MAXVALUE.
  • Anda tidak dapat menjalankan pernyataan ALTER TABLE ... ADD PARTITION untuk menambahkan partisi ke tabel yang memiliki aturan MAXVALUE. Namun, Anda dapat menjalankan pernyataan ALTER TABLE ... SPLIT PARTITION untuk membagi partisi yang ada.
  • Anda tidak dapat menjalankan pernyataan ALTER TABLE... ADD SUBPARTITION untuk menambahkan subpartisi ke tabel yang memiliki aturan MAXVALUE. Namun, Anda dapat menjalankan pernyataan ALTER TABLE... SPLIT SUBPARTITION untuk membagi subpartisi yang ada.
Aturan MAXVALUE memiliki sintaksis berikut:
PARTITION nama_partisi VALUES LESS THAN (MAXVALUE)

Dalam sintaksis, nama_partisi menentukan nama partisi yang digunakan untuk menyimpan baris yang tidak sesuai dengan aturan partisi yang ditentukan untuk partisi lainnya.

Pada contoh terakhir, tabel terpartisi rentang dibuat. Data dalam tabel ini dipartisi berdasarkan nilai kolom tanggal. Jika Anda mencoba menambahkan baris di mana nilai tanggal lebih dari nilai tanggal yang ditentukan dalam aturan partisi, PolarDB melaporkan kesalahan:
acctg=# INSERT INTO sales VALUES
acctg-#   (40, '3000x', 'IRELAND', '01-Mar-2013', '45000');
ERROR:  inserted partition key does not map to any partition
Perintah CREATE TABLE berikut membuat tabel yang sama, tetapi tabel ini memiliki partisi MAXVALUE. Alih-alih melaporkan kesalahan, server menyimpan semua baris yang tidak sesuai dengan aturan partisi sebelumnya di partisi lainnya.
CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
(
  PARTITION q1_2012 VALUES LESS THAN('2012-Apr-01'),
  PARTITION q2_2012 VALUES LESS THAN('2012-Jul-01'),
  PARTITION q3_2012 VALUES LESS THAN('2012-Oct-01'),
  PARTITION q4_2012 VALUES LESS THAN('2013-Jan-01'),
  PARTITION others VALUES LESS THAN (MAXVALUE)
);
Untuk menguji partisi MAXVALUE, tambahkan baris di mana nilai kolom tanggal lebih dari nilai tanggal terakhir yang terdaftar dalam setiap aturan partisi. Server menyimpan baris ini di partisi lainnya:
INSERT INTO sales VALUES
                    (40, '3000x', 'IRELAND', '2015-Oct-01', '45000');
Anda dapat memeriksa tabel penjualan untuk melihat apakah baris yang sebelumnya ditolak sekarang disimpan di partisi sales_others:
acctg=# SELECT tableoid::regclass, * FROM sales;  
   tableoid    | dept_no | part_no | country  |        date        | amount 
---------------+---------+---------+----------+--------------------+---------
 sales_q1_2012 |      10 | 4519b   | FRANCE   | 17-JAN-12 00:00:00 |    45000
 sales_q1_2012 |      20 | 3788a   | INDIA    | 01-MAR-12 00:00:00 |    75000
 sales_q1_2012 |      30 | 9519b   | CANADA   | 01-FEB-12 00:00:00 |    75000
 sales_q2_2012 |      40 | 9519b   | US       | 12-APR-12 00:00:00 |   145000
 sales_q2_2012 |      20 | 3788a   | PAKISTAN | 04-JUN-12 00:00:00 |    37500
 sales_q2_2012 |      30 | 4519b   | CANADA   | 08-APR-12 00:00:00 |   120000
 sales_q2_2012 |      40 | 3788a   | US       | 12-MAY-12 00:00:00 |     4950
 sales_q3_2012 |      10 | 9519b   | ITALY    | 07-JUL-12 00:00:00 |    15000
 sales_q3_2012 |      10 | 9519a   | FRANCE   | 18-AUG-12 00:00:00 |   650000
 sales_q3_2012 |      10 | 9519b   | FRANCE   | 18-AUG-12 00:00:00 |   650000
 sales_q3_2012 |      20 | 3788b   | INDIA    | 21-SEP-12 00:00:00 |     5090
 sales_q3_2012 |      40 | 4788a   | US       | 23-SEP-12 00:00:00 |     4950
 sales_q4_2012 |      40 | 4577b   | US       | 11-NOV-12 00:00:00 |    25000
 sales_q4_2012 |      30 | 7588b   | CANADA   | 14-DEC-12 00:00:00 |    50000
 sales_q4_2012 |      40 | 4788b   | US       | 09-OCT-12 00:00:00 |    15000
 sales_q4_2012 |      20 | 4519a   | INDIA    | 18-OCT-12 00:00:00 |   650000
 sales_q4_2012 |      20 | 4519b   | INDIA    | 02-DEC-12 00:00:00 |     5090
 sales_others  |      40 | 3000x   | IRELAND  | 01-MAR-13 00:00:00 |    45000
(18 rows)