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

时间:2010-09-13 14:13:20

标签: sql oracle constraints rename table-rename

我正在进行大型Oracle数据库的批量迁移。第一步是将一大堆表重命名为稍后删除它们的准备(但我现在需要将数据保存在其中)。需要删除对它们的任何外键约束 - 它们根本不应连接到数据库的其余部分。如果我现在放弃它们我可以使用CASCADE CONSTRAINTS,但重命名只是改变了约束。

有没有办法可以放弃CASCADE CONSTRAINTS在不丢弃表本身的情况下放下的所有约束?

2 个答案:

答案 0 :(得分:22)

您可以使用动态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子句中指定列表,除非它们的名字有一些模式。

答案 1 :(得分:0)

您可以在不删除约束的情况下禁用/重新启用约束。看看this article