|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
Ребят, кто работал с партиционированием, подскажите пожалуйста Две таблицы 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 записи удалялись, а при обновлении обновлялись в ссылающихся таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 13:07 |
|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
kliff, Никак то что вы хотите не работает и вряд ли когда то будет. Такие схемы партиционирования делаются только на старом механизме через наследование и триггера (где уже любую нужную логику прописываешь руками). >Как тогда быть? Отказаться от такой схемы или переделать ее на старую схема партиционирования с триггерами. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 13:50 |
|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию. Тогда вообще не понятно как мы можем обновлять данные в таблице, которая имеет fk на секционированную таблицу. например апдейт признака is_expired в таблице notice ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 13:54 |
|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
Maxim Boguk, Большое спасибо за ответ. Понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 13:55 |
|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 14:17 |
|
внешний ключ на партиционированную таблицу.
|
|||
---|---|---|---|
#18+
kliff Получается UPDATE по сути нет команды. UPDATE на секционированной таблице это delete из одной секции и insert в другую секцию. Тогда вообще не понятно как мы можем обновлять данные в таблице, которая имеет fk на секционированную таблицу. например апдейт признака is_expired в таблице notice Не предполагается даже теоретически update полей по которым партиционирование идет тем более в случае каскадного обновления по fk UNSUPPORTED feature и таким будет скорее всего... "не делайте так" -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 14:28 |
|
|
start [/forum/topic.php?fid=53&msg=40060148&tid=1994096]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 256ms |
total: | 377ms |
0 / 0 |