使用 ALTER TABLE… TRUNCATE SUBPARTITION 命令可从指定的二级分区中删除所有数据,而二级分区结构保持不变。语法如下:

ALTER TABLE table_name
  TRUNCATE SUBPARTITION subpartition_name
  [{DROP|REUSE} STORAGE]

说明

ALTER TABLE… TRUNCATE SUBPARTITION 命令从指定的二级分区中删除所有数据,而二级分区结构保持不变。

ALTER TABLE… TRUNCATE SUBPARTITION 将不会导致表可能存在的 ON DELETE 触发器触发,但它将触发 ON TRUNCATE 触发器。如果为二级分区定义了 ON TRUNCATE 触发器,则所有 BEFORE TRUNCATE 触发器都将在截断发生之前触发,并且所有AFTER TRUNCATE 触发器都将在最后一次截断发生之后触发。

您必须具有表的 TRUNCATE 特权才能调用 ALTER TABLE… TRUNCATE SUBPARTITION。

参数

参数 说明
table_name 分区表的名称(可能是 schema 限定的)。
subpartition_name 要截断的二级分区的名称。

DROP STORAGE 和 REUSE STORAGE 子句仅为了实现兼容性而提供;这些子句会被分析和忽略。

示例 - 清空二级分区

后面的示例从 sales 表的二级分区中删除数据。使用以下命令创建 sales 表:

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date) SUBPARTITION BY LIST (country)
(   PARTITION "2011" VALUES LESS THAN('01-JAN-2012')
  (
    SUBPARTITION europe_2011 VALUES ('ITALY', 'FRANCE'),
    SUBPARTITION asia_2011 VALUES ('PAKISTAN', 'INDIA'),
    SUBPARTITION americas_2011 VALUES ('US', 'CANADA')
  ),
  PARTITION "2012" VALUES LESS THAN('01-JAN-2013')
  (
    SUBPARTITION europe_2012 VALUES ('ITALY', 'FRANCE'),
    SUBPARTITION asia_2012 VALUES ('PAKISTAN', 'INDIA'),
    SUBPARTITION americas_2012 VALUES ('US', 'CANADA')
  ),   PARTITION "2013" VALUES LESS THAN('01-JAN-2015')
  (
    SUBPARTITION europe_2013 VALUES ('ITALY', 'FRANCE'),
    SUBPARTITION asia_2013 VALUES ('PAKISTAN', 'INDIA'),
    SUBPARTITION americas_2013 VALUES ('US', 'CANADA')
  )
);

使用以下命令填充 sales 表:

INSERT INTO sales VALUES
  (10, '4519b', 'FRANCE', '17-Jan-2011', '45000'),
  (20, '3788a', 'INDIA', '01-Mar-2012', '75000'),
  (40, '9519b', 'US', '12-Apr-2012', '145000'),
  (20, '3788a', 'PAKISTAN', '04-Jun-2012', '37500'),
  (40, '4577b', 'US', '11-Nov-2012', '25000'),
  (30, '7588b', 'CANADA', '14-Dec-2011', '50000'),
  (30, '4519b', 'CANADA', '08-Apr-2012', '120000'),
  (40, '3788a', 'US', '12-May-2011', '4950'),
  (20, '3788a', 'US', '04-Apr-2012', '37500'),
  (40, '4577b', 'INDIA', '11-Jun-2011', '25000'),
  (10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
  (20, '4519b', 'INDIA', '2-Dec-2012', '5090');

通过查询 sales 表,可以看到行已分配在二级分区中:

acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid       | dept_no | part_no | country|        date        | amount
-------------------+---------+---------+--------+--------------------+------
sales_americas_2011 |      30| 7588b   | CANADA | 14-DEC-11 00:00:00 | 50000
sales_americas_2011 |      40| 3788a   | US     | 12-MAY-11 00:00:00 | 4950
sales_europe_2011   |      10| 4519b   | FRANCE | 17-JAN-11 00:00:00 | 45000
sales_asia_2011     |      40| 4577b   | INDIA  | 11-JUN-11 00:00:00 | 25000
sales_americas_2012 |      40| 9519b   | US     | 12-APR-12 00:00:00 | 145000
 sales_americas_2012|      40| 4577b   | US     | 11-NOV-12 00:00:00 |  25000
 sales_americas_2012|      30| 4519b   | CANADA | 08-APR-12 00:00:00 | 120000
 sales_americas_2012|      20| 3788a   | US     | 04-APR-12 00:00:00 |  37500
 sales_europe_2012  |      10| 9519b   | ITALY  | 07-JUL-12 00:00:00 |  15000
 sales_asia_2012    |      20| 3788a   | INDIA  | 01-MAR-12 00:00:00 |  75000
 sales_asia_2012    |      20| 3788a   |PAKISTAN| 04-JUN-12 00:00:00 |  37500
 sales_asia_2012    |      20| 4519b   | INDIA  | 02-DEC-12 00:00:00 |   5090
(12 rows)

要删除 2012_americas 分区的内容,请调用以下命令:

ALTER TABLE sales TRUNCATE SUBPARTITION "americas_2012";

现在,通过查询 sales 表,可以看到 americas_2012 分区的内容已被删除。

acctg=# SELECT tableoid::regclass, * FROM sales;
     tableoid      | dept_no| part_no | country  |        date        |amount
-------------------+--------+---------+----------+--------------------+------
sales_americas_2011|      30| 7588b   | CANADA   | 14-DEC-11 00:00:00 | 50000
sales_americas_2011|      40| 3788a   | US       | 12-MAY-11 00:00:00 |  4950
sales_europe_2011  |      10| 4519b   | FRANCE   | 17-JAN-11 00:00:00 | 45000
sales_asia_2011    |      40| 4577b   | INDIA    | 11-JUN-11 00:00:00 | 25000
sales_europe_2012  |      10| 9519b   | ITALY    | 07-JUL-12 00:00:00 | 15000
sales_asia_2012    |      20| 3788a   | INDIA    | 01-MAR-12 00:00:00 | 75000
sales_asia_2012    |      20| 3788a   | PAKISTAN | 04-JUN-12 00:00:00 | 37500
sales_asia_2012    |      20| 4519b   | INDIA    | 02-DEC-12 00:00:00 |  5090
(8 rows)

虽然 2012_americas 分区的行已被删除,但其结构仍保持不变:

acctg=# SELECT subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
 subpartition_name |             high_value
-------------------+-------------------------------------
 AMERICAS_2011     | FOR VALUES IN ('US', 'CANADA')
 ASIA_2011         | FOR VALUES IN ('PAKISTAN', 'INDIA')
 EUROPE_2011       | FOR VALUES IN ('ITALY', 'FRANCE')
 AMERICAS_2012     | FOR VALUES IN ('US', 'CANADA')
 ASIA_2012         | FOR VALUES IN ('PAKISTAN', 'INDIA')
 EUROPE_2012       | FOR VALUES IN ('ITALY', 'FRANCE')
 AMERICAS_2013     | FOR VALUES IN ('US', 'CANADA')
 ASIA_2013         | FOR VALUES IN ('PAKISTAN', 'INDIA')
 EUROPE_2013       | FOR VALUES IN ('ITALY', 'FRANCE')
(9 rows)