ALTER TABLE… TRUNCATE SUBPARTITION_与 Oracle 数据库兼容的分区命令_表分区_兼容Oracle数据库开发指南_云数据库PolarDB
ALTER TABLE… TRUNCATE SUBPARTITION
使用 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)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论