ALTER TABLE…EXCHANGE PARTITION命令可以用一個分區或子分區交換現有的表。
文法介紹
如果您打算添加大量的資料到分區表中,可以使用ALTER TABLE…EXCHANGE PARTITION命令來進行批量載入。您也可以使用ALTER TABLE…EXCHANGE PARTITION命令來刪除舊資料或不再需要的資料。
ALTER TABLE…EXCHANGE PARTITION命令有以下兩種形式。
- 第一種形式是把表換成分區:
ALTER TABLE target_table EXCHANGE PARTITION target_partition WITH TABLE source_table [(WITH | WITHOUT) VALIDATION];
- 第二種形式是把表換成子分區 :
ALTER TABLE target_table EXCHANGE SUBPARTITION target_subpartition WITH TABLE source_table [(WITH | WITHOUT) VALIDATION];
ALTER TABLE…EXCHANGE PARTITION命令在分區和子分區之間沒有任何區別。
- 您可以使用EXCHANGE PARTITION或EXCHANGE SUBPARTITION子句來交換分區。
- 您可以使用EXCHANGE PARTITION或EXCHANGE SUBPARTITION子句來交換子分區。
描述
當完成ALTER TABLE…EXCHANGE PARTITION命令的執行後,最初在target_partition中的資料就會位於source_table中,而最初在source_table中的資料則會位於target partition中。
source_table的結構必須與target_table的結構匹配(也就是說兩個表必須有匹配的列和資料類型),且表內的資料必須依附分區約束。
PolarDB接受WITHOUT VALIDATION子句,但會忽略。新表通常都是經過驗證的。
您必須有一個表,才能基於這個表來調用ALTER TABLE…EXCHANGE PARTITION或ALTER TABLE…EXCHANGE SUBPARTITION。
參數
參數 | 參數說明 |
target table | 分區所屬的表名稱(可以採用模式限定的方式引用)。 |
target partition | 要替換的分區或子分區的名稱。 |
source table | 要替換target_partition 的表名稱。 |
與表交換分區樣本
下面樣本示範了把一個表換成了表sales中的分區(americas)的操作。您可以使用下列命令建立表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')
);
使用下列命令添加樣本資料到表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');
查詢表sales來顯示分區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)
下列命令建立了一個與表sales定義匹配的表(n_america):
CREATE TABLE n_america
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
);
下列命令添加了資料到表n_america中。資料與分區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');
下列命令將表換成分區表:
ALTER TABLE sales
EXCHANGE PARTITION americas
WITH TABLE n_america;
對錶sales的查詢顯示了表n_america中的內容已和分區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)
對錶n_america的查詢顯示了之前儲存在分區americas中的記錄已被移動到表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)