Как я могу разделить таблицу PostgreSQL, используя часть символьного поля? - PullRequest
0 голосов
/ 20 апреля 2020

PostgreSQL 11.4

Таблица foo содержит поле my_datetime с изменяющимся символом (254)

Я хочу разделить foo, используя это поле, но только часть года, месяца, дня строковое значение 20200328175432

Substr(my_datetime,0,9) дает мне 20200328 <- это значение, которое я хочу использовать в качестве моего "ключа раздела" </p>

Поскольку это поле charcater, я предположил, что мне нужно сделайте что-то вроде to_date(substr(my_datetime),'YYYYMMDD'), чтобы привести его к дате, чтобы мое определение раздела выглядело так:

partition by range to_date(substr(datetime,0,9), 'YYYYMMDD');

, но это не работает.

Так что мне нужно go Старая школа и создание триггера при вставке для перемещения моих данных (фу, черт, около 100 000 строк каждые 5 минут)

Я не могу изменить определения полей таблицы, возможно, я смогу добавить поля, но Мне нужно было бы добавить триггер, чтобы заполнить их - верно?

Создание таблиц разделов - это не то, о чем я спрашиваю - предположим, у меня каждый день года в течение следующих 5 лет создается как 20200328_foo

У кого-нибудь есть предложения? Что-то еще я могу попробовать?

1 Ответ

2 голосов
/ 20 апреля 2020

Вам нужно будет создать функцию, чтобы преодолеть сомнительное (не сказать глупое) дизайнерское решение этого поставщика программного обеспечения:

create function fix_broken_type(p_input text)
  returns date
as
$$
  select to_date(p_input, 'yyyymmddhh24miss');
$$
language sql
immutable; --<<< this is important

Затем вы можете использовать эту функцию для определения раздела:

CREATE TABLE data
(
   want_to_be_timestamp varchar
)
partition by range (fix_broken_type(want_to_be_timestamp));

И затем добавьте разделы:

create table data_2020_01_01 partition of data
  for values from ('2020-01-01') TO ('2020-01-02');

Конечно, это с треском провалится, если будет вставлено значение, которое не может быть преобразовано с использованием to_date() таким образом.

Онлайн пример

...