Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 внешний ключ на партиционированную таблицу.  [new]
kliff
Member

Откуда:
Сообщений: 363
Ребят, кто работал с партиционированием, подскажите пожалуйста

Две таблицы
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 записи удалялись, а при обновлении обновлялись в ссылающихся таблицах?
6 апр 21, 13:07    [22305017]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4691
kliff,

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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
6 апр 21, 13:50    [22305044]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
kliff
Member

Откуда:
Сообщений: 363
Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию.

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

например апдейт признака is_expired в таблице notice
6 апр 21, 13:54    [22305048]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
kliff
Member

Откуда:
Сообщений: 363
Maxim Boguk,
Большое спасибо за ответ. Понял.
6 апр 21, 13:55    [22305049]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1280
kliff,

емнип это вот этот багфикс: https://commitfest.postgresql.org/32/2877/ пока в разработке
6 апр 21, 14:17    [22305053]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4691
kliff
Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию.

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

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


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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
6 апр 21, 14:28    [22305059]     Ответить | Цитировать Сообщить модератору
 Re: внешний ключ на партиционированную таблицу.  [new]
kliff
Member

Откуда:
Сообщений: 363
Melkij, то есть какая то движуха есть в этом направлении, потенциально будет.
7 апр 21, 09:20    [22305265]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить