如何在不删除子 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 不要忘记重新创建外键。
我有一位家长 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 不要忘记重新创建外键。