Todos os produtos
Search
Central de documentação

:Como lidar com valores órfãos em tabelas particionadas por lista ou intervalo

Última atualização: Jun 28, 2026

Este tópico descreve como tratar valores órfãos em uma tabela particionada por lista ou intervalo.

Uma partição ou subpartição DEFAULT ou MAXVALUE captura as linhas que não correspondem às outras regras de particionamento definidas para a tabela.

Definir uma partição DEFAULT

Em tabelas particionadas por lista ou com subpartições por lista, a partição DEFAULT armazena as linhas que não se encaixam nas demais partições. Se você não incluir uma regra DEFAULT, qualquer linha contendo um valor fora das regras de particionamento gerará um erro. Cada partição em uma tabela particionada por lista, ou cada subpartição em uma tabela com subpartições por lista, pode ter sua própria regra DEFAULT.

A regra DEFAULT tem a seguinte sintaxe:

PARTITION partition_name VALUES (DEFAULT)

Nessa sintaxe, partition_name especifique o nome da partição ou subpartição usada para armazenar as linhas que não correspondem às regras de particionamento definidas para as outras partições.

No exemplo a seguir, crie-se uma tabela particionada por lista. O servidor determina em qual partição dessa tabela os dados serão armazenados com base no valor da coluna country. Se você tentar adicionar uma linha cujo valor da coluna country não esteja listado nas regras, o PolarDB retornará um erro:

acctg=# INSERT INTO sales VALUES
acctg-#   (40, '3000x', 'IRELAND', '01-Mar-2012', '45000');
ERROR:  inserted partition key does not map to any partition

No próximo exemplo, a mesma tabela é criada, mas com uma partição DEFAULT adicionada. As regras de particionamento definem quais valores são armazenados nas partições europe, asia ou americas. Se o valor de uma linha não estiver especificado nessas regras, o servidor armazena a linha na partição others.

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

Para testar a partição DEFAULT, adicione uma linha em que o valor da coluna country não corresponda aos países especificados nas regras de particionamento:

INSERT INTO sales VALUES
  (40, '3000x', 'IRELAND', '01-Mar-2012', '45000');

Consulte a tabela sales para verificar se a linha anteriormente rejeitada agora está armazenada na partição 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)

Observe que o PolarDB não consegue reatribuir o conteúdo de uma partição ou subpartição DEFAULT.

  • Não é possível execute o comando ALTER TABLE...ADD PARTITION para adicionar uma partição a uma tabela que já possui uma regra DEFAULT. No entanto, use o comando ALTER TABLE...SPLIT PARTITION para dividir as partições existentes.

  • Também não é permitido execute o comando ALTER TABLE...ADD SUBPARTITION para adicionar uma subpartição a uma tabela com regra DEFAULT. Contudo, o comando ALTER TABLE...SPLIT SUBPARTITION permite dividir as subpartições atuais.

Definir uma partição MAXVALUE

Uma partição ou subpartição MAXVALUE captura as linhas que não se encaixam nas demais partições de uma tabela particionada por intervalo ou com subpartições por intervalo. Sem uma regra MAXVALUE, ocorrerá um erro sempre que uma linha contiver um valor acima do limite superior definido pelas regras de particionamento. Cada partição ou subpartição pode ter sua própria partição MAXVALUE.

Vale ressaltar que o PolarDB não consegue reatribuir o conteúdo de uma partição ou subpartição MAXVALUE.

  • O comando ALTER TABLE ... ADD PARTITION não pode ser usado para adicionar uma partição a uma tabela que contenha uma regra MAXVALUE. Alternativamente, utilize o comando ALTER TABLE ... SPLIT PARTITION para dividir as partições existentes.

  • Da mesma forma, o comando ALTER TABLE... ADD SUBPARTITION não funciona para adicionar subpartições a tabelas com regra MAXVALUE. Nesse caso, use o comando ALTER TABLE... SPLIT SUBPARTITION para dividir as subpartições já criadas.

A regra MAXVALUE tem a seguinte sintaxe:

PARTITION partition_name VALUES LESS THAN (MAXVALUE)

Nesse contexto, partition_name indica o nome da partição destinada a armazenar as linhas que não atendem às regras de particionamento das outras partições.

No exemplo anterior, foi criada uma tabela particionada por intervalo. Os dados dessa tabela são divididos conforme os valores da coluna date. Ao tentar inserir uma linha com data posterior àquela definida nas regras de particionamento, o PolarDB exibirá um erro:

acctg=# INSERT INTO sales VALUES
acctg-#   (40, '3000x', 'IRELAND', '01-Mar-2013', '45000');
ERROR:  inserted partition key does not map to any partition

O comando CREATE TABLE abaixo cria a mesma tabela, porém incluindo uma partição MAXVALUE. Em vez de gerar um erro, o servidor armazena todas as linhas que não correspondem às regras anteriores na partição others.

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

Para validar a partição MAXVALUE, insira uma linha cuja data seja posterior à última data listada em cada regra de particionamento. O servidor direcionará essa linha para a partição others:

INSERT INTO sales VALUES
                    (40, '3000x', 'IRELAND', '2015-Oct-01', '45000');

Consulte a tabela sales para confirmar se a linha antes rejeitada passou a residir na partição 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)