ALTER TABLE…EXCHANGE PARTITION命令可以用一個分區(qū)或子分區(qū)交換現(xiàn)有的表。

語法介紹

如果您打算添加大量的數(shù)據(jù)到分區(qū)表中,可以使用ALTER TABLE…EXCHANGE PARTITION命令來進(jìn)行批量加載。您也可以使用ALTER TABLE…EXCHANGE PARTITION命令來刪除舊數(shù)據(jù)或不再需要的數(shù)據(jù)。

ALTER TABLE…EXCHANGE PARTITION命令有以下兩種形式。
  • 第一種形式是把表換成分區(qū):
    ALTER TABLE target_table 
      EXCHANGE PARTITION target_partition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];
  • 第二種形式是把表換成子分區(qū) :
    ALTER TABLE target_table 
      EXCHANGE SUBPARTITION target_subpartition 
      WITH TABLE source_table 
      [(WITH | WITHOUT) VALIDATION];
ALTER TABLE…EXCHANGE PARTITION命令在分區(qū)和子分區(qū)之間沒有任何區(qū)別。
  • 您可以使用EXCHANGE PARTITION或EXCHANGE SUBPARTITION子句來交換分區(qū)。
  • 您可以使用EXCHANGE PARTITION或EXCHANGE SUBPARTITION子句來交換子分區(qū)。

描述

當(dāng)完成ALTER TABLE…EXCHANGE PARTITION命令的執(zhí)行后,最初在target_partition中的數(shù)據(jù)就會位于source_table中,而最初在source_table中的數(shù)據(jù)則會位于target partition中。

source_table的結(jié)構(gòu)必須與target_table的結(jié)構(gòu)匹配(也就是說兩個表必須有匹配的列和數(shù)據(jù)類型),且表內(nèi)的數(shù)據(jù)必須依附分區(qū)約束。

PolarDB接受WITHOUT VALIDATION子句,但會忽略。新表通常都是經(jīng)過驗證的。

您必須有一個表,才能基于這個表來調(diào)用ALTER TABLE…EXCHANGE PARTITION或ALTER TABLE…EXCHANGE SUBPARTITION。

參數(shù)

參數(shù) 參數(shù)說明
target table 分區(qū)所屬的表名稱(可以采用模式限定的方式引用)。
target partition 要替換的分區(qū)或子分區(qū)的名稱。
source table 要替換target_partition的表名稱。

與表交換分區(qū)示例

下面示例演示了把一個表換成了表sales中的分區(qū)(americas)的操作。您可以使用下列命令創(chuàng)建表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')
);
使用下列命令添加樣本數(shù)據(jù)到表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來顯示分區(qū)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)
下列命令創(chuàng)建了一個與表sales定義匹配的表(n_america):
CREATE TABLE n_america
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date    date,
  amount  number
);
下列命令添加了數(shù)據(jù)到表n_america中。數(shù)據(jù)與分區(qū)americas的分區(qū)規(guī)則一致:
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');
下列命令將表換成分區(qū)表:
ALTER TABLE sales 
  EXCHANGE PARTITION americas 
  WITH TABLE n_america; 
對表sales的查詢顯示了表n_america中的內(nèi)容已和分區(qū)americas中的內(nèi)容交換:
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的查詢顯示了之前存儲在分區(qū)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)