VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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)