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;