#postgresql #database-partitioning #postgresql-11
#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
Ответ №1:
Возможность указывать выражения для границ разделов была введена в Postgres 12.
Разрешить использование границ разделов в качестве любого выражения (Кетаро Хоригучи, Том Лейн, Амит Ланготе)
Такие выражения вычисляются во время создания секционированной таблицы. Ранее в качестве границ раздела разрешались только простые константы.
Обратите внимание на часть «простые константы» для более ранних версий. Вам придется перейти на 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');