如何在PostgreSQL中删除表而不删除子表

时间:2018-09-26 14:03:11

标签: sql postgresql postgresql-9.5

我有一个称为Parent的父表。 用作其他3个表child1,child2,child3的外键的父表的ID

我想删除表并再次创建父表。我不想丢失子表中的数据。

2 个答案:

答案 0 :(得分:2)

提醒,请注意!

在使用之前,请确保在显式事务中进行尝试,以检查该语句是否确实执行了您想要的操作,仅此而已。您可以使用BEGIN;开始交易,并使用COMMIT;保存交易。万一出问题,您随时可以使用ROLLBACK;

手动回滚

相关文档:transactions


解决方案/ 1

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

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

在此处引用手册,粗体强调:

  

(...)删除表所引用的表或另一个表的外键约束,必须指定 CASCADE < / strong>。 (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;

相关文档:dropping constraint

答案 1 :(得分:1)

您必须将所有外键从父表拖放到子表。即使用以下方式删除child1的外键:

ALTER TABLE parent_table 
  DROP CONSTRAINT IF EXISTS fk_to_child1;

稍后删除表,然后再次创建表时,不要忘记重新创建外键。