【问题标题】:PostgreSQL 11 - Getting error when trying to partition with timestampPostgreSQL 11 - 尝试使用时间戳进行分区时出错
【发布时间】:2020-11-24 09:45:49
【问题描述】:

我在我的应用上使用 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

【问题讨论】:

    标签: postgresql database-partitioning postgresql-11


    【解决方案1】:

    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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2017-02-05
      • 2017-02-13
      • 2014-02-12
      • 2019-05-31
      相关资源
      最近更新 更多