Todos os produtos
Search
Central de documentação

PolarDB:ALTER TABLE...EXCHANGE PARTITION

Última atualização: Jun 28, 2026

O comando ALTER TABLE...EXCHANGE PARTITION troca uma tabela existente por uma partição ou subpartição.

Visão geral

Para adicionar um grande volume de dados a uma tabela particionada, use o comando ALTER TABLE...EXCHANGE PARTITION para transferir dados em massa. Esse comando também permite remover dados obsoletos ou redundantes do armazenamento.

O comando ALTER TABLE...EXCHANGE PARTITION tem duas formas:

  • A primeira forma troca uma tabela por uma partição:

    ALTER TABLE target_table 
      EXCHANGE PARTITION target_partition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];
  • A segunda forma troca uma tabela por uma subpartição:

    ALTER TABLE target_table 
      EXCHANGE SUBPARTITION target_subpartition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];

O comando ALTER TABLE...EXCHANGE PARTITION não distingue entre partição e subpartição:

  • Troque uma partição usando a cláusula EXCHANGE PARTITION ou EXCHANGE SUBPARTITION.

  • Troque uma subpartição usando a cláusula EXCHANGE PARTITION ou EXCHANGE SUBPARTITION.

Descrição

Após a conclusão do comando ALTER TABLE...EXCHANGE PARTITION, os dados são trocados. Os dados que originalmente residiam na partição de destino passam a residir na tabela de origem, e os dados da tabela de origem passam a residir na partição de destino.

A estrutura da tabela de origem deve corresponder à estrutura da tabela de destino (ambas devem ter colunas e tipos de dados compatíveis). Além disso, os dados contidos na tabela devem obedecer às restrições de particionamento.

PolarDB for PostgreSQL (Compatible with Oracle) aceita a cláusula WITHOUT VALIDATION, mas a ignora. A nova tabela é sempre validada.

Você deve ser proprietário da tabela para executar ALTER TABLE...EXCHANGE PARTITION ou ALTER TABLE...EXCHANGE SUBPARTITION nessa tabela.

Parâmetros

Parâmetro

Descrição

target_table

Nome da tabela (opcionalmente qualificado com schema) onde a partição reside.

target_partition

Nome da partição ou subpartição a ser substituída.

source_table

Nome da tabela que substituirá a target_partition.

Exemplo - trocar uma tabela por uma partição

O exemplo a seguir demonstra a troca de uma tabela pela partição americas da tabela sales. Execute o comando abaixo para criar a tabela 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')
);

Execute o comando a seguir para adicionar dados de exemplo à tabela 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');

Ao consultar a tabela sales, observa-se que apenas uma linha reside na partição 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)

O comando a seguir cria uma tabela (n_america) que corresponde à definição da tabela sales:

CREATE TABLE n_america
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date    date,
  amount  number
);

O comando abaixo adiciona dados à tabela n_america. Esses dados obedecem às regras de particionamento da partição 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');

O comando a seguir troca a tabela pela partição na tabela particionada:

ALTER TABLE sales 
  EXCHANGE PARTITION americas 
  WITH TABLE n_america; 

Ao consultar a tabela sales, verifica-se que o conteúdo da tabela n_america foi trocado pelo conteúdo da partição 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)

A consulta à tabela n_america mostra que a linha anteriormente armazenada na partição americas foi movida para a tabela 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)