CREATE TABLE PARTITION
功能描述
创建分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。
本文档只介绍CREATE TABLE PARTITION语句兼容MySQL的特性,原Vastbase的
CREATE TABLE PARTITION
语法未做删除和修改,详见CREATE TABLE PARTITION。
Vastbase在MySQL兼容模式下,支持CREATE TABLE PARTITION
如下特性用法:
支持分区表使用函数作为分区条件。支持的函数列表如下:
ABS CEILING DATEDIFF DAY DAYOFMONTH DAYOFWEEK FLOOR HOUR MICROSECOND MINUTE MOD MONTH EXTRACT SECOND TIME_TO_SEC TO_DAYS TO_SECONDS UNIX_TIMESTAMP DAYOFYEAR QUARTER WEEKDAY YEAR YEARWEEK 支持使用表达式当作分区键,允许分区键使用算术运算符+、-、*和div。
注意事项
该功能仅在数据库兼容模式为MySQL时支持(即数据库初始化时指定DBCOMPATIBILITY='B')。
语法格式
CREATE TABLE PARTITION
语法未做删除和修改,详见CREATE TABLE PARTITION。
参数说明
CREATE TABLE PARTITION
参数详见CREATE TABLE PARTITION参数说明。
示例
示例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)