一、根据范围分区
CREATE TABLE main_table_name (
    id bigint,
    code bigint
) PARTITION BY RANGE (code); #根据code值分区

CREATE TABLE partition_name1 PARTITION OF main_table_name FOR VALUES FROM (0) TO (99);
CREATE TABLE partition_name2 PARTITION OF main_table_name FOR VALUES FROM (100) TO (199);
二、根据枚举(列表)分区
CREATE TABLE hr_user (id int, name varchar(10), dept varchar(10))
PARTITION BY LIST (dept); #每个部分一个分区
CREATE TABLE hr_user_1 PARTITION OF hr_user FOR VALUES IN ('HR');
CREATE TABLE hr_user_2 PARTITION OF hr_user FOR VALUES IN ('FI');
三、根据哈希分区
每个分区的数据通过提供模数和余数来分区。每个分区将包含模数除以分区键的哈希值得到给定余数的行。可以均匀地分布数据来避免对单个表的访问集中
CREATE TABLE emp (id int, emp_name varchar(10), dept_id int)
PARTITION BY HASH (dept_id);

CREATE TABLE emp_0 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 0);
CREATE TABLE emp_1 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 1);
CREATE TABLE emp_2 PARTITION OF emp FOR VALUES WITH (MODULUS 3,REMAINDER 2);
PostgreSQL 分区的限制
以下是 PostgreSQL 分区的一些限制:

1、没有在所有分区上自动创建匹配索引的选项。必须使用单独的命令向每个分区添加索引。这也意味着没有办法构建主键、唯一约束或跨越所有分区的排除约束;相反,每个叶分区必须单独约束。

2、不支持引用分区表的外键,以及从分区表到另一个表的外键引用,因为分区表不支持主键。

3、不可能在同一分区树中混合临时和永久关系。因此,如果分区表是永久的,则其分区也必须是永久的,如果分区表是临时的,其分区也必须是临时的。使用临时关系时,分区树的所有成员必须来自同一会话。

4、行触发器必须在单个分区上定义,而不是在分区表中定义。

5、范围分区不接受 NULL 值。
示例代码参考【PG分区-按范围】【PG分区-按时间范围】【PG分区-按枚举值】【PG分区-按HASH