如何在不删除子 table 的情况下在 PostgreSQL 中删除 table

How to drop table in PostgreSQL without droping child table

我有一位家长 table 叫家长。 用作其他 3 tables child1,child2,child3

的外键的父 table 的 ID

我想删除 table 并重新创建父 table。我不想丢失子 table 中的数据。

提醒,小心!

使用前,请确保在显式事务中尝试此操作,以检查该语句是否完全按照您的要求执行,仅此而已。您可以使用 BEGIN; 开始交易并使用 COMMIT; 保存。如果出现任何问题,您可以随时使用 ROLLBACK;

手动回滚

相关文档:transactions


Solution/1

使用DROP TABLE ... CASCADE将删除依赖它的table和ALL对象(视图,外键约束......),将它们列为输出中的 NOTICE(至少在 psql 中):

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

这里引用手册,大胆强调我的:

(...) to drop a table that is referenced by a view or a foreign-key constraint of another table, CASCADE must be specified. (CASCADE will remove a dependent view entirely, but in the foreign-key case it will only remove the foreign-key constraint, not the other table entirely.)


Solution/2

如果您更喜欢手动执行操作(当您不知道 table 的依赖范围时),请删除对子 table 的约束并删除父项table 和往常一样。

通常,您会执行这些操作:

-- 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;

相关文档:dropping constraint

您必须将父项 table 中的所有外键删除给子项。即删除 child1 的外键:

ALTER TABLE parent_table 
  DROP CONSTRAINT IF EXISTS fk_to_child1;

稍后删除 table 然后当您再次创建时 table 不要忘记重新创建外键。