"SET FOREIGN_KEY_CHECKS = 0;" 的 Oracle 等价语句是什么?

12

有没有与禁用Mysql特定指令的外键约束检查等价的方法?
SET FOREIGN_KEY_CHECKS = 0;

3个回答

10

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

5
"

SET FOREIGN_KEY_CHECKS = 0;"是基于会话的。在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时进行的,请参见文档

如果您的引用不是循环的,则只需按另一顺序删除表即可。


1
如果您想要禁用外键的查询,请尝试以下方法:

ALTER TABLE mytable
DISABLE CONSTRAINT fk_mytable;


我希望这个指令能够等同于删除表格但不会出现约束问题。 - abderrahim_05
例如在MySQL中,我们可以删除多个表而不会出现此问题: - abderrahim_05
2
SET FOREIGN_KEY_CHECKS = 0; - abderrahim_05
SET FOREIGN_KEY_CHECKS = 1; - abderrahim_05
为什么你想要删除一个表并且保留约束条件? - Moudiz
以上三个评论是我想要做的一个例子。 - abderrahim_05

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接