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 | 分區表的名稱(可以採用模式限定的方式引用)。 |
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_2011_europe | 10| 4519b | FRANCE | 17-JAN-11 00:00:00| 45000
sales_2011_asia | 40| 4577b | INDIA | 11-JUN-11 00:00:00| 25000
sales_2011_americas| 30| 7588b | CANADA | 14-DEC-11 00:00:00| 50000
sales_2011_americas| 40| 3788a | US | 12-MAY-11 00:00:00| 4950
sales_2012_europe | 10| 9519b | ITALY | 07-JUL-12 00:00:00| 15000
sales_2012_asia | 20| 3788a | INDIA | 01-MAR-12 00:00:00| 75000
sales_2012_asia | 20| 3788a | PAKISTAN | 04-JUN-12 00:00:00| 37500
sales_2012_asia | 20| 4519b | INDIA | 02-DEC-12 00:00:00| 5090
sales_2012_americas| 40| 9519b | US | 12-APR-12 00:00:00| 145000
sales_2012_americas| 40| 4577b | US | 11-NOV-12 00:00:00| 25000
sales_2012_americas| 30| 4519b | CANADA | 08-APR-12 00:00:00| 120000
sales_2012_americas| 20| 3788a | US | 04-APR-12 00:00:00| 37500
(12 rows)
要刪除分區2012_americas的內容,先要調用下列命令:
ALTER TABLE sales TRUNCATE SUBPARTITION "americas_2 012";
現在,查詢表sales顯示了分區americas_2012的內容已被刪除:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no|part_no| country | date | amount
--------------------+--------+-------+----------+--------------------+-------
sales_2011_europe | 10| 4519b | FRANCE | 17-JAN-11 00:00:00 | 45000
sales_2011_asia | 40| 4577b | INDIA | 11-JUN-11 00:00:00 | 25000
sales_2011_americas| 30| 7588b | CANADA | 14-DEC-11 00:00:00 | 50000
sales_2011_americas| 40| 3788a | US | 12-MAY-11 00:00:00 | 4950
sales_2012_europe | 10| 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_2012_asia | 20| 3788a | INDIA | 01-MAR-12 00:00:00 | 75000
sales_2012_asia | 20| 3788a | PAKISTAN | 04-JUN-12 00:00:00 | 37500
sales_2012_asia | 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
-------------------+---------------------
2013_europe | 'ITALY', 'FRANCE'
2012_europe | 'ITALY', 'FRANCE'
2011_europe | 'ITALY', 'FRANCE'
2013_asia | 'PAKISTAN', 'INDIA'
2012_asia | 'PAKISTAN', 'INDIA'
2011_asia | 'PAKISTAN', 'INDIA'
2013_americas | 'US', 'CANADA'
2012_americas | 'US', 'CANADA'
2011_americas | 'US', 'CANADA'
(9
rows)