【问题标题】:"SET FOREIGN_KEY_CHECKS = 0;" Oracle Equivalent“SET FOREIGN_KEY_CHECKS = 0;”甲骨文等价物
【发布时间】:2013-06-18 11:34:38
【问题描述】:

是否有一些与 Mysql 特定指令等效的禁用外键约束检查的指令?
SET FOREIGN_KEY_CHECKS = 0;

【问题讨论】:

    标签: oracle key database-integrity


    【解决方案1】:

    如果您要求查询以禁用外键,请尝试以下操作:

    ALTER TABLE mytable
    禁用约束 fk_mytable;

    【讨论】:

    • 我希望这条指令等同于删除表而不会出现约束问题。
    • 例如在 MySQL 中,我们可以删除多个表而不会出现此问题:
    • SET FOREIGN_KEY_CHECKS = 0;
    • SET FOREIGN_KEY_CHECKS = 1;
    • 为什么要删除表并离开约束?
    【解决方案2】:

    Oracle 中没有命令可以一次性禁用所有约束。

    但是,您似乎想在删除表的上下文中禁用约束。在这种情况下,您可以使用 CASCADE CONSTRAINTS 子句从其他表中删除引用约束以及要删除的表。

    这是一个例子:

    SQL> CREATE TABLE t1 (ID NUMBER PRIMARY KEY);
    
    Table created
    
    SQL> CREATE TABLE t2 (ID NUMBER REFERENCES t1);
    
    Table created
    
    SQL> INSERT INTO t1 VALUES (1);
    
    1 row inserted
    
    SQL> INSERT INTO t2 VALUES (1);
    
    1 row inserted
    
    SQL> -- this fails because of the foreign key
    SQL> DROP TABLE t1;
    
    ORA-02449: unique/primary keys in table referenced by foreign keys
    
    SQL> DROP TABLE t1 CASCADE CONSTRAINTS;
    
    Table dropped
    

    【讨论】:

      【解决方案3】:

      SET FOREIGN_KEY_CHECKS = 0;session based。在 Oracle 上下文中,我只能想象当您有循环引用时您需要这样做。

      您已经评论说这是您想要做的:

      SET FOREIGN_KEY_CHECKS = 0;
      DROP TABLE table1;
      DROP TABLE table2;
      SET FOREIGN_KEY_CHECKS = 1; 
      

      我假设这意味着 TABLE1 有一个引用 TABLE2 的外键,而 TABLE2 有一个引用 TABLE1 的外键。

      如果是这样,那么Moudiz's answer 是正确的。您想在删除表之前禁用外键:

      alter table table1 disable constraint <constraint_name>;
      alter table table2 disable constraint <constraint_name>;
      drop table table1;
      drop table table2;
      

      在会话期间禁用所有外键是没有意义的,您只对其中两个感兴趣,这两个都将随表一起删除。

      您不想永远禁用所有外键。

      我能想到的唯一其他上下文是,如果您想在循环引用中插入一些东西,在这种情况下,您可以将约束声明为 DEFERRABLE。这意味着约束检查在事务结束时完成,而不是在执行 DML 时完成,请参阅the documentation

      如果您的引用不是循环的,那么只需按其他顺序删除表格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多