PostgreSQL如何在单条语句中声明多个分区
PostgreSQL 单条语句创建多个分区的实现方案
PostgreSQL 支持多种方式实现和Oracle类似的单次操作创建多个分区,具体如下:
- 方式1:
ALTER TABLE批量追加分区(支持PostgreSQL 11+)
已经创建分区主表后,可以在单条ALTER TABLE语句中添加多个ADD PARTITION子句完成批量分区创建,示例如下:
首先创建范围分区主表:
单条语句创建2024年上半年6个月的分区:CREATE TABLE orders ( order_id INT, create_time DATE, amount NUMERIC ) PARTITION BY RANGE(create_time);ALTER TABLE orders ADD PARTITION orders_202401 VALUES FROM ('2024-01-01') TO ('2024-02-01'), ADD PARTITION orders_202402 VALUES FROM ('2024-02-01') TO ('2024-03-01'), ADD PARTITION orders_202403 VALUES FROM ('2024-03-01') TO ('2024-04-01'), ADD PARTITION orders_202404 VALUES FROM ('2024-04-01') TO ('2024-05-01'), ADD PARTITION orders_202405 VALUES FROM ('2024-05-01') TO ('2024-06-01'), ADD PARTITION orders_202406 VALUES FROM ('2024-06-01') TO ('2024-07-01'); - 方式2:建表时同步创建多个分区(支持PostgreSQL 14+)
从PostgreSQL 14开始,支持在CREATE TABLE创建分区主表的语句中直接定义所有分区,和Oracle的单条建表+分区语法完全对齐:CREATE TABLE orders ( order_id INT, create_time DATE, amount NUMERIC ) PARTITION BY RANGE(create_time) PARTITION orders_202401 VALUES FROM ('2024-01-01') TO ('2024-02-01'), PARTITION orders_202402 VALUES FROM ('2024-02-01') TO ('2024-03-01'), PARTITION orders_202403 VALUES FROM ('2024-03-01') TO ('2024-04-01'); - 方式3:低版本兼容批量创建方案
如果你使用的是PostgreSQL 10及更早版本,不支持上述语法,可以通过执行一次DO匿名代码块批量生成所有分区:DO $$ DECLARE month_start DATE := '2024-01-01'; BEGIN FOR i IN 1..6 LOOP EXECUTE format( 'CREATE TABLE orders_%s PARTITION OF orders VALUES FROM (%L) TO (%L)', to_char(month_start, 'YYYYMM'), month_start, month_start + INTERVAL '1 month' ); month_start := month_start + INTERVAL '1 month'; END LOOP; END $$;
所有方式创建的分区都支持正常的增删改查操作,和单独创建的分区没有差异。
内容的提问来源于stack exchange,提问作者Pushpender Singh
相关产品推荐
相关产品推荐

