PostgreSQL 11 - 尝试使用时间戳进行分区时出错
PostgreSQL 11 - Getting error when trying to partition with timestamp
我在我的应用程序上使用 postgres-11,但遇到分区问题。
我创建了一个分区 table 如下:
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);
稍后,当我尝试使用 TO_TIMESTAMP
:
以 'yyyy-MM-dd HH24'
格式分割分区时
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 中引入了为分区边界指定表达式的功能。
Allow partition bounds to be any expression (Kyotaro Horiguchi, Tom Lane, Amit Langote)
Such expressions are evaluated at partitioned-table creation time. Previously, only simple constants were allowed as partition bounds.
注意早期版本的“简单常量”部分。如果您确实想使用该语法,则必须升级到 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');
我在我的应用程序上使用 postgres-11,但遇到分区问题。
我创建了一个分区 table 如下:
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);
稍后,当我尝试使用 TO_TIMESTAMP
:
'yyyy-MM-dd HH24'
格式分割分区时
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 中引入了为分区边界指定表达式的功能。
Allow partition bounds to be any expression (Kyotaro Horiguchi, Tom Lane, Amit Langote)
Such expressions are evaluated at partitioned-table creation time. Previously, only simple constants were allowed as partition bounds.
注意早期版本的“简单常量”部分。如果您确实想使用该语法,则必须升级到 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');