Как удалить таблицу в PostgreSQL без удаления дочерней таблицы - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть одна родительская таблица с именем Parent.Идентификатор родительской таблицы, используемый в качестве внешнего ключа для других 3 таблиц child1, child2, child3

. Я хочу удалить таблицу и снова создать родительскую таблицу.Я не хочу терять данные в дочерних таблицах.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы должны сбросить все внешние ключи из родительской таблицы в childs.т.е. удалите внешний ключ child1 с помощью:

ALTER TABLE parent_table 
  DROP CONSTRAINT IF EXISTS fk_to_child1;

Позже УДАЛИТЕ таблицу, затем при повторном создании таблицы не забудьте заново создать внешние ключи.

0 голосов
/ 26 сентября 2018

Напоминание, осторожность!

Перед использованием не забудьте попробовать это в явной транзакции, чтобы проверить, выполняет ли оператор именно то, что вы хотели, и ничего более.Вы можете начать транзакцию с помощью BEGIN; и сохранить ее с помощью COMMIT;.Если что-то пойдет не так, вы всегда можете откатить его вручную, используя ROLLBACK;

Документы по теме: транзакции


Solution / 1

Использование DROP TABLE ... CASCADE удалит таблицу и ALL объекты, которые зависят от нее (представления, ограничения внешнего ключа ...), перечислив их как NOTICE в выводе (по крайней мере, в psql):

-- Replace table_name with the name of your parent table
DROP TABLE table_name CASCADE;

Цитируя здесь руководство, выделите жирным шрифтом:

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


Solution / 2

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

Как правило, вы выполняете следующие операции:

-- Replace object names to suit your case
-- Dropping foreign key constraint on child table pointing to parent table
ALTER TABLE child_table DROP CONSTRAINT constraint_name;
-- Repeat above for all constraints in all child tables
-- Drop the parent table
DROP TABLE parent_table;

Документы, связанные с: ограничение удаления

...