JastaFly
@JastaFly

Как перенести данные из одной таблицы в другую не нарушив ограничения целостности БД в PostgresSQL?

Хочу разбить таблицу на партиции:
CREATE TABLE ticket_part_1 () INHERITS (ticket);
ALTER TABLE ticket_part_1 ADD CONSTRAINT partition_check CHECK (purchase_timestamp < 2022-09-14 21:51:18.872183+03);
INSERT INTO ticket_part_1 (ticket_id, session_id, seat_id, purchase_timestamp)
SELECT *
FROM ticket
WHERE purchase_timestamp < '2022-09-14 21:51:18.872183+03';
DELETE FROM ONLY ticket WHERE purchase_timestamp < '2022-09-14 21:51:18.872183+03';

Но из-за ограничения целостности я не могу удалить данные из родительской таблицы ticket, после их вставки в ticket_part_1. Подскажите как это сделать?!?
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
JastaFly
@JastaFly Автор вопроса
В итоге решил проблему сначала дропнув ограничения целостности и восстановив его в самом конце запроса:
ALTER TABLE order_to_ticket DROP CONSTRAINT ticket_fk;
CREATE TABLE ticket_part_1 () INHERITS (ticket);
ALTER TABLE ticket_part_1 ADD CONSTRAINT partition_check CHECK (purchase_timestamp < '2022-09-14 21:51:18.872183+03');
INSERT INTO ticket_part_1 (ticket_id, session_id, seat_id, purchase_timestamp)
SELECT *
FROM ticket
WHERE purchase_timestamp < '2022-09-14 21:51:18.872183+03';
DELETE FROM ONLY ticket WHERE purchase_timestamp < '2022-09-14 21:51:18.872183+03';
ALTER TABLE ONLY order_to_ticket
ADD CONSTRAINT ticket_fk FOREIGN KEY (ticket_id) REFERENCES ticket(ticket_id) NOT VALID;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
phoinixrw
@phoinixrw
Архитектор информационных систем
Ну у вас скорее наследование с условиями распределения, а не партиционирование, но можно и так.

Ошибка в том, что старую таблицу так же надо делать партицией (в вашем случае потомком)
ALTER TABLE ticket RENAME TO ticket_part_default;
CREATE TABLE ticket (LIKE ticket_part_default);
ALTER TABLE ticket_part_default INHERIT ticket;
...

Далее все как у вас, только удаление делать из ticket_part_default
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы