12

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

4

3 回答 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
于 2013-06-21T12:25:02.430 回答
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 的回答是正确的。您想在删除表之前禁用外键:

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

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

您不想禁用所有外键。

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

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

于 2013-06-21T12:27:26.050 回答
1

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

ALTER TABLE mytable
禁用约束 fk_mytable;

于 2013-06-21T10:59:20.427 回答