Как удалить таблицу в PostgreSQL, не удаляя дочернюю таблицу

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

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


person Sandesh Dumbre    schedule 26.09.2018    source источник
comment
Вы используете MySQL или Postgresql?   -  person jarlh    schedule 26.09.2018
comment
@jarlh я предполагаю, что это postgresql, так как он имеет два тега и находится в заголовке   -  person WhatsThePoint    schedule 26.09.2018


Ответы (2)


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

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

Связанные документы: транзакции


Решение/1

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

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

Цитирование руководства здесь, жирный акцент мой:

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


Решение/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;

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

person Kamil Gosciminski    schedule 26.09.2018
comment
Будьте осторожны, DROP TABLE parent_table CASCADE; удаляет ВСЕ объекты, связанные с этой таблицей, что также означает триггеры и представления. - person Raymond Nijland; 26.09.2018
comment
@wildplasser как CASCADE удаляет данные из других таблиц? - person Kamil Gosciminski; 26.09.2018
comment
.... Я не хочу терять данные дочерней таблицы. @wildplasser, но в случае внешнего ключа он удалит только ограничение внешнего ключа, не другую таблицу полностью - person Raymond Nijland; 26.09.2018
comment
@RaymondNijland Я выделил слово ВСЕ жирным шрифтом, спасибо за дополнение. - person Kamil Gosciminski; 26.09.2018

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

ALTER TABLE parent_table 
  DROP CONSTRAINT IF EXISTS fk_to_child1;

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

person Ernesto Campohermoso    schedule 26.09.2018