12

我正在对大型 Oracle 数据库进行一些批量迁移。第一步涉及重命名整个表负载,以准备稍后删除它们(但我现在需要将数据保留在其中)。需要删除对它们的任何外键约束——它们根本不应该连接到数据库的其余部分。如果我现在删除它们,我可以级联约束,但重命名只会改变约束。

有没有一种方法可以删除 CASCADE CONSTRAINTS 会删除的所有约束而不删除表本身?

4

2 回答 2

28

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

于 2010-09-13T15:04:27.237 回答
0

您可以禁用/重新启用约束而不删除它们。看看这篇文章

于 2010-09-13T14:15:43.090 回答