San*_*bre 2 sql postgresql postgresql-9.5
我有一张名为 Parent 的父表。用作其他 3 个表 child1,child2,child3 的外键的父表的 id
我想删除该表并再次创建父表。我不想丢失子表中的数据。
提醒,小心!
使用之前,请确保在显式事务中尝试此操作,以检查该语句是否完全按照您希望的方式执行,仅此而已。您可以使用 启动交易BEGIN;并使用 保存交易COMMIT;。如果出现任何问题,您可以随时使用手动将其回滚ROLLBACK;
相关文档:交易
解决方案/1
使用DROP TABLE ... CASCADE将删除表和依赖于它的所有对象(视图、外键约束...),将它们在输出中列为 a NOTICE(至少在 psql 中):
-- Replace table_name with the name of your parent table
DROP TABLE table_name CASCADE;
Run Code Online (Sandbox Code Playgroud)
这里引用手册,大胆强调我的:
(...) 要删除被另一个表的视图或外键约束引用的表,必须指定 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;
Run Code Online (Sandbox Code Playgroud)
相关文档:删除约束