我有一个称为Parent的父表。 用作其他3个表child1,child2,child3的外键的父表的ID
我想删除表并再次创建父表。我不想丢失子表中的数据。
答案 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;
稍后删除表,然后再次创建表时,不要忘记重新创建外键。