Создайте контрольное ограничение для HSTORE для поддержания указанной c последовательности данных - PullRequest
1 голос
/ 11 июля 2020

Вопрос касается ограничения проверки на поле HSTORE в Postgres.

create table archives_seasonmodel
    (episodes      hstore)

Это очень сокращенная версия таблицы, которая у меня есть, но, например, ее нормально.

Эпизоды содержат данные в следующем формате:

{ 
1 => 2020-03-01, 2 => 2020-03-07,  5=> 2020-03-29, 3=> 2020-03-14
}

Где ключ всегда положительный di git, а значение - дата.

Я хочу создать ограничение, которое будет проверять любые новые данные на наличие следующее условие:

- каждая дата в паре ключ / значение должна быть больше или равна предыдущей паре ключ / значение, упорядоченной ключами AS C.

Хорошие данные:

{ 
1 => 2020-03-01, 2 => 2020-03-07,  5=> 2020-03-29, 3=> 2020-03-14
}
2020-03-29 >= 2020-03-14 >=   2020-03-07 >=  2020-03-01

5 >=3 >=2 >=1

Неверные данные:

{ 
1 => 2020-03-01, 2 => 2020-06-07,  5=> 2020-03-29, 3=> 2020-03-14
}
2020-03-29 >= 2020-03-14 not >=   2020-06-07 >=  2020-03-01

5 >=3 >=2 >=1

2020-03-14 not >= 2020-06-07 но должно быть так, как 2020-03-14 имеет ключ 3 2020-06-07 имеет ключ 2. Дата ключа 3 должна быть больше или равна дате ключа 2, потому что 3 > 2.

Можно ли создать такое ограничение или это просто не соответствует действительности ???

Спасибо

1 Ответ

2 голосов
/ 11 июля 2020

Создать функцию для проверки условия. Используйте функцию hstore each() и функцию агрегирования array_agg().

create or replace function check_episodes(hstore)
returns boolean language sql as $$
    select array_agg(key order by key::int) = array_agg(key order by value::date)
    from each($1)
$$;

create table archives_seasonmodel (
    episodes hstore check (check_episodes(episodes))
);

Db <> fiddle.

...