CREATE TABLE SUBPARTITION
功能描述
创建二级分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。对于二级分区表,顶层节点表和一级分区都是逻辑表,不存储数据,只有二级分区(叶子节点)存储数据。
二级分区表的分区方案是由两个一级分区的分区方案组合而来的,一级分区的分区方案详见章节CREATE TABLE PARTITION。
本文档只介绍CREATE TABLE SUBPARTITION语句兼容MySQL的特性,原Vastbase的CREATE TABLE SUBPARTITION语法未做删除和修改,详见CREATE TABLE SUBPARTITION。
Vastbase在MySQL兼容模式下,支持CREATE TABLE SUBPARTITION
如下特性用法:
CONSTRAINT [ constraint_name ]
语法,在MySQL兼容模式下constraint_name为可选项,在其他模式数据库下,必须加上constraint_name。- 支持在指定表约束时使用索引名。
- 支持在创建二级分区时指定创建索引的方法。
注意事项
该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
语法格式
create table partition_table_name
...
PARTITION BY {
{RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] ( partition_less_than_item [, ... ] )} |
...
partition_less_than_item:设置范围分区上边界
PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) | MAXVALUE
参数说明
partition_table_name
分区表的名称。
PARTITION BY RANGE(partition_key)
创建范围分区。partition_key为分区键的名称。
INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, … ] ) ]
间隔分区定义信息。
- interval_expr:自动创建分区的间隔,例如:1 day、1 month。
- STORE IN (tablespace_name [, … ] ):指定存放自动创建分区的表空间列表,如果有指定,则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。
列存表不支持间隔分区。
PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) | MAXVALUE
指定各分区的信息。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。
- 每个分区都需要指定一个上边界。
- 分区上边界的类型应当和分区键的类型一致。
- 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。
- 该情形下,分区键支持的数据类型为:TINYINT[UNSIGNED]、SMALLINT[UNSIGNED]、INTEGER[UNSIGNED]、BIGINT[UNSIGNED]、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、CHARACTER(n)、CHAR(n)、CHARACTER、CHAR、TEXT、NVARCHAR、NVARCHAR2、NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。
示例
示例1: MONTH函数作为分区键创建LIST分区表。
1、创建分区表使用MONTH函数作为分区键。
CREATE TABLE my_table1155872 (id INT,created_date DATE)
PARTITION BY LIST (MONTH(created_date)) (
PARTITION p1 VALUES IN (1, 2, 3),
PARTITION p2 VALUES IN (4, 5, 6),
PARTITION p3 VALUES IN (7, 8, 9),
PARTITION p4 VALUES IN (10, 11, 12)
);
2、插入数据。
insert into my_table1155872 values (1,'2023-05-23');
insert into my_table1155872 values (2,'2023-08-23');
insert into my_table1155872 values (3,'2023-12-23');
3、查看分区表数据。
select * from my_table1155872 PARTITION(p1);
select * from my_table1155872 PARTITION(p2);
select * from my_table1155872 PARTITION(p3);
select * from my_table1155872 PARTITION(p4);
返回结果分别为:
id | created_date
----+--------------
(0 rows)
id | created_date
----+--------------
1 | 2023-05-23
(1 row)
id | created_date
----+--------------
2 | 2023-08-23
(1 row)
id | created_date
----+--------------
3 | 2023-12-23
(1 row)
示例2: 分区表使用less than maxvalue
语法。
1、创建分区表。
CREATE TABLE my_table1155885(id INT,sale_date DATE)
PARTITION BY RANGE(MONTH(sale_date))(
PARTITION p1 VALUES LESS THAN (5),
PARTITION p2 VALUES LESS THAN (7),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
2、插入数据。
insert into my_table1155885 values(0,'2021-03-23');
insert into my_table1155885 values(1,'2022-05-23');
insert into my_table1155885 values(2,'2022-08-23');
3、查看分区表数据。
select * from my_table1155885 PARTITION(p1);
select * from my_table1155885 PARTITION(p2);
select * from my_table1155885 PARTITION(p3);
返回结果分别为:
id | sale_date
----+------------
0 | 2021-03-23
(1 row)
id | sale_date
----+------------
1 | 2022-05-23
(1 row)
id | sale_date
----+------------
2 | 2022-08-23
(1 row)
示例3: 分区键使用算术运算符-
。
1、创建分区表。
CREATE TABLE my_table1155995(partition_key INT,column1 VARCHAR(255))
PARTITION BY RANGE (partition_key - 1)
(
PARTITION p1 VALUES LESS THAN (100),
PARTITION p2 VALUES LESS THAN (200),
PARTITION p3 VALUES LESS THAN (300)
);
2、插入数据。
insert into my_table1155995 values(89, 'vastbasevastbase');
insert into my_table1155995 values(100, 'vastbasevastbase');
insert into my_table1155995 values(280, 'vastbasevastbase');
3、查看分区表数据。
select * from my_table1155995 partition(p1);
select * from my_table1155995 partition(p2);
select * from my_table1155995 partition(p3);
返回结果分别为:
partition_key | column1
---------------+------------------
89 | vastbasevastbase
100 | vastbasevastbase
(2 rows)
partition_key | column1
---------------+---------
(0 rows)
partition_key | column1
---------------+------------------
280 | vastbasevastbase
(1 row)
示例4: 使用表达式作为分区键。
1、创建分区表。
create table testrangepart_1156035(a int, b int)
partition by range(abs(a*2))
(
partition p0 values less than(100),
partition p1 values less than(200)
);
2、插入数据。
insert into testrangepart_1156035 values(-51,1),(49,2);
insert into testrangepart_1156035 values(-101,1);
返回结果为:
INSERT 0 2
ERROR: inserted partition key does not map to any table partition
3、查看分区表数据。
select * from testrangepart_1156035 partition(p0);
select * from testrangepart_1156035 partition(p1);
select * from testrangepart_1156035 where a = -51;
返回结果分别为:
a | b
----+---
49 | 2
(1 row)
a | b
-----+---
-51 | 1
(1 row)
a | b
-----+---
-51 | 1
(1 row)
4、更新分区。
update testrangepart_1156035 set a = -48 where a = -51;
5、查询更新后的分区。
select * from testrangepart_1156035 partition(p0);
select * from testrangepart_1156035 partition(p1);
返回结果为:
a | b
-----+---
49 | 2
-48 | 1
(2 rows)
a | b
---+---
(0 rows)
6、删除数据并查询结果。
delete from testrangepart_1156035 where a = -48 or a = 49;
select * from testrangepart_1156035;
返回结果为:
a | b
---+---
(0 rows)