【问题标题】:How to drop table in PostgreSQL without droping child table如何在不删除子表的情况下删除 PostgreSQL 中的表
【发布时间】:2018-09-26 14:03:11
【问题描述】:

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

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

【问题讨论】:

  • 你使用的是 MySQL 还是 Postgresql?
  • @jarlh 我假设它的 postgresql 因为它有两个标签并且在标题中

标签: sql postgresql postgresql-9.5


【解决方案1】:

提醒,小心!

在使用之前,请确保在显式事务中尝试此操作,以检查该语句是否完全按照您的意愿执行,仅此而已。您可以使用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。 (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

【讨论】:

  • 小心DROP TABLE parent_table CASCADE; 删除与该表相关的 ALL 对象,也意味着触发器和视图。
  • @wildplasser CASCADE 如何从其他表中删除数据?
  • "....我不想丢失子表的数据。" @wildplasser “但在外键情况下,它只会删除外键约束,而不是完全删除另一个表”
  • @RaymondNijland 我已将 ALL 字加粗,感谢您的补充。
【解决方案2】:

您必须将所有外键从父表中删除到子表中。即删除 child1 的外键:

ALTER TABLE parent_table 
  DROP CONSTRAINT IF EXISTS fk_to_child1;

稍后 DROP 表,然后当您再次创建表时不要忘记重新创建外键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 2015-01-13
    • 2011-07-14
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多