“SET FOREIGN_KEY_CHECKS = 0;” Oracle等效

时间:2013-06-21 10:55:24

标签: oracle key database-integrity

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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

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

答案 2 :(得分:0)

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

  

ALTER TABLE mytable
  禁用CONSTRAINT fk_mytable;