Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / внешний ключ на партиционированную таблицу. / 7 сообщений из 7, страница 1 из 1
06.04.2021, 13:07
    #40060131
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
Ребят, кто работал с партиционированием, подскажите пожалуйста

Две таблицы
CREATE TABLE notice (
id serial NOT NULL,
is_expired bool NOT NULL DEFAULT false,
CONSTRAINT notice_pk PRIMARY KEY (id, is_expired)
)PARTITION BY LIST (is_expired);

CREATE TABLE notice_body (
notice_id int4 NOT NULL,
is_expired bool NOT NULL DEFAULT false,
content text NULL
CONSTRAINT notice_body_fk FOREIGN KEY (notice_id, is_expired) REFERENCES notice(id, is_expired) ON DELETE CASCADE
)
PARTITION BY LIST (is_expired);

Вставляю записи в обе таблицы, по секциям легли как надо.

Не могу понять, теперь делаю UPDATE notice поля is_expired, запись перекладывается в другую секцию, но в notice_body она тупо удаляется.

Пробовал CONSTRAINT notice_body_fk FOREIGN KEY (notice_id, is_expired) REFERENCES notice(id, is_expired) ON UPDATE CASCADE

Причина:
SQL Error [23503]: ERROR: update or delete on table "notice_notexpired" violates foreign key constraint "notice_body_notice_id_is_expired_fkey" on table "notice_body"
Подробности: Key (id, is_expired)=(1, f) is still referenced from table "notice_body".

notice_notexpired это секция таблицы notice по PARTITION OF notice FOR VALUES in (false);

Как тогда быть? Как правильно настроить ключи, чтоб при удалении в notice записи удалялись, а при обновлении обновлялись в ссылающихся таблицах?
...
Рейтинг: 0 / 0
06.04.2021, 13:50
    #40060146
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
kliff,

Никак то что вы хотите не работает и вряд ли когда то будет.
Такие схемы партиционирования делаются только на старом механизме через наследование и триггера (где уже любую нужную логику прописываешь руками).

>Как тогда быть?
Отказаться от такой схемы или переделать ее на старую схема партиционирования с триггерами.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
06.04.2021, 13:54
    #40060147
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию.

Тогда вообще не понятно как мы можем обновлять данные в таблице, которая имеет fk на секционированную таблицу.

например апдейт признака is_expired в таблице notice
...
Рейтинг: 0 / 0
06.04.2021, 13:55
    #40060148
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
Maxim Boguk,
Большое спасибо за ответ. Понял.
...
Рейтинг: 0 / 0
06.04.2021, 14:17
    #40060151
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
kliff,

емнип это вот этот багфикс: https://commitfest.postgresql.org/32/2877/ пока в разработке
...
Рейтинг: 0 / 0
06.04.2021, 14:28
    #40060155
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
kliff
Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию.

Тогда вообще не понятно как мы можем обновлять данные в таблице, которая имеет fk на секционированную таблицу.

например апдейт признака is_expired в таблице notice


Не предполагается даже теоретически update полей по которым партиционирование идет
тем более в случае каскадного обновления по fk

UNSUPPORTED feature и таким будет скорее всего... "не делайте так"

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
07.04.2021, 09:20
    #40060268
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
внешний ключ на партиционированную таблицу.
Melkij, то есть какая то движуха есть в этом направлении, потенциально будет.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / внешний ключ на партиционированную таблицу. / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]