PolarDB PostgreSQL版(兼容Oracle)支持交换两个分区或者子分区的内容。本文详细介绍了其语法及示例。
语法说明
交换分区
ALTER TABLE <target_table>
EXCHANGE PARTITION <target_partition>
WITH TABLE <source_table>
[(INCLUDING | EXCLUDING) INDEXES]
[(WITH | WITHOUT) VALIDATION];
交换子分区
ALTER TABLE <target_table>
EXCHANGE SUBPARTITION <target_subpartition>
WITH TABLE <source_table>
[(INCLUDING | EXCLUDING) INDEXES]
[(WITH | WITHOUT) VALIDATION];
ALTER TABLE…EXCHANGE PARTITION
命令将现有表与分区交换。 如果您计划向分区表添加大量数据,可以使用ALTER TABLE…EXCHANGE PARTITION
命令来实现批量加载。 您还可以使用ALTER TABLE…EXCHANGE PARTITION
命令删除旧的或不需要的数据进行存储。当
ALTER TABLE…EXCHANGE PARTITION
命令执行完成时,原来位于target_partition
中的数据将交换至source_table
中,原来位于source_table
中的数据将交换至target_partition
中。ALTER TABLE…EXCHANGE PARTITION
命令可以交换LIST、RANGE或HASH分区表中的分区。source_table
的结构必须与target_table
的结构匹配(两个表必须具有匹配的列和数据类型),并且表中包含的数据必须遵守分区约束。如果使用
EXCHANGE PARTITION
指定INCLUDING INDEXES
子句,则将交换target_partition
和source_table
中的匹配索引。target_partition
中与source_table
中不匹配的索引将被重建,反之亦然(即source_table
中与target_partition
中不匹配的索引也会被重建)。如果使用
EXCHANGE PARTITION
指定EXCLUDING INDEXES
子句,则将交换target_partition
和source_table
中匹配的索引,但source_table
中与target_partition
中不匹配的索引将被标记为无效,反之亦然(即target_partition
中与source_table
中不匹配的索引也被标记为无效)。使用的匹配索引项是指具有相同属性的索引。例如,由
CREATE INDEX
命令确定的排序顺序、升序/降序方向、空值在前/空值在后的排序等。如果
INCLUDING INDEXES
和EXCLUDING INDEXES
都被省略,则默认操作是EXCLUDING INDEXES
行为。与上面描述相同的行为适用于与
EXCHANGE SUBPARTITION
子句一起使用的target_subpartition
。您必须拥有一个表才能对该表调用
ALTER TABLE...EXCHANGE PARTITION
或ALTER TABLE...EXCHANGE SUBPARTITION
命令。
示例
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')
);
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');
CREATE TABLE n_america
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
);
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');
ALTER TABLE sales
EXCHANGE PARTITION americas
WITH TABLE n_america;