Oracle - 删除表约束而不删除表

12

我正在进行一项大型Oracle数据库的批量迁移工作。其中第一步涉及将大量表格重命名,作为稍后删除它们的准备工作(但我需要保留它们现在包含的数据)。这些表格上的任何外键约束都需要被删除 - 它们不应该与数据库的其他部分连接。如果现在要删除它们,可以使用CASCADE CONSTRAINTS,但重命名只会修改这些约束。

有没有办法在不删除表格本身的情况下删除所有CASCADE CONSTRAINTS会删除的约束?

2个回答

30

你可以使用动态SQL和数据字典来完成:

begin
    for r in ( select table_name, constraint_name
               from user_constraints
               where constraint_type = 'R' )
    loop
        execute immediate 'alter table '|| r.table_name
                          ||' drop constraint '|| r.constraint_name;
    end loop;
end;

如果这些表被多个用户拥有,你需要从 DBA_CONSTRAINTS 表中获取数据,并在查询语句的投影以及执行语句中包含 OWNER。如果你只想操作其中的一部分表,除非表名有某种模式,否则你需要在 WHERE 子句中指定列表。


看起来不错。我添加了一些约束条件以反映我想要修改的表,并选择了这个方案。谢谢! - Submonoid

0

您可以在不删除它们的情况下禁用/重新启用约束。请查看本文


1
真的,但这并没有真正对我有帮助。我可以绕过/禁用各个约束条件,但这是一个大型数据库,我不想去查找引用我正在移动的表的所有约束条件。我希望能够自动删除所有约束条件,就像使用'DROP TABLE foo CASCADE CONSTRAINTS'一样。 - Submonoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接