【问题标题】:Oracle - drop table constraints without dropping tablesOracle - 删除表约束而不删除表
【发布时间】:2011-04-11 16:51:36
【问题描述】:

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

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

【问题讨论】:

    标签: sql oracle constraints rename table-rename


    【解决方案1】:

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

    【讨论】:

    • 看起来不错。我已经添加了几个约束来反映我想要修改哪些表并使用它。谢谢!
    【解决方案2】:

    您可以禁用/重新启用约束而不删除它们。看看this article

    【讨论】:

    • 是的,但这对我没有帮助。我可以四处删除/禁用单个约束,但它是一个大数据库,我不想去查找引用我正在移动的表的所有约束。我希望能够以与使用“DROP TABLE foo CASCADE CONSTRAINTS”相同的方式自动删除所有约束。
    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多