postgresql - PostgreSQL 11 - 尝试使用时间戳进行分区时出错
问题描述
我在我的应用程序上使用 postgres-11,但我遇到了分区问题。
我创建了一个分区表,如下所示:
CREATE TABLE IF NOT EXISTS MEASUREMENT (
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
...
CONSTRAINT MEASUREMENT_PK PRIMARY KEY (date,...)
)
PARTITION BY RANGE (date);
CREATE TABLE MEASUREMENT_P_INFINITY PARTITION OF MEASUREMENT FOR VALUES FROM (MINVALUE) TO (MAXVALUE);
后来,当我尝试使用以下格式拆分分区'yyyy-MM-dd HH24'
时TO_TIMESTAMP
:
ALTER TABLE MEASUREMENT DETACH PARTITION MEASUREMENT_P_INFINITY;
CREATE TABLE MEASUREMENT_P_2020_11_24_03
PARTITION OF MEASUREMENT
FOR VALUES FROM (TO_TIMESTAMP('1970-01-01 10', 'yyyy-MM-dd HH24'))
TO (TO_TIMESTAMP('2020-11-24 04', 'yyyy-MM-dd HH24'));
ALTER TABLE MEASUREMENT ATTACH PARTITION MEASUREMENT_P_INFINITY
FOR VALUES FROM (TO_TIMESTAMP('2020-11-24 04', 'yyyy-MM-dd HH24'))
TO (MAXVALUE);
我收到以下错误消息:
org.postgresql.util.PSQLException: ERROR: syntax error at or near "TO_TIMESTAMP"
我尝试了一个简单的查询:
select TO_TIMESTAMP('1970-01-01 10', 'yyyy-MM-dd HH24');
它工作得很好。
当我使用 postgres-13 时,它工作正常。
PostgreSQL 11 分区文档:https ://www.postgresql.org/docs/11/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE
解决方案
Postgres 12中引入了为分区边界指定表达式的能力。
允许分区边界为任何表达式(Kyotaro Horiguchi、Tom Lane、Amit Langote)
此类表达式在分区表创建时进行评估。以前,只允许简单的常量作为分区边界。
请注意早期版本的“简单常量”部分。如果您确实想使用该语法,则必须升级到 Postgres 12 或 13。
在 Postgres 11 中,您需要编写完整的时间戳值:
CREATE TABLE MEASUREMENT_P_2020_11_24_03
PARTITION OF MEASUREMENT
FOR VALUES FROM ('1970-01-01 10:00:00') TO ('2020-11-24 04:00:00');
推荐阅读
- c++ - 尝试验证数据时内部有些奇怪
- ajax - 如何将 Json 分配给 drafjs 中的编辑器?
- xamarin.forms - Xamarin:电话号码验证
- java - 为什么 OpenCV-Java 无法连接到 mjpeg-stream(来自烧瓶)而 Python3/cv2 可以做到?
- bootstrap-4 - 如何在 Bootstrap 4 中减小小屏幕中的图标大小
- xslt - 如果条件满足,XLS 创建新元素
- visual-c++ - 开发 Visual Studio 通用项目 - 如何在 for 循环中从顺序命名的 TextBox 中提取文本
- keycloak - Keycloak 授权服务不会拒绝资源中的范围
- apache-kafka - kafka-consumer-groups CLI 未显示 node-kafka consumer groupf
- php - 删除特定的机器人