web-dev-qa-db-ja.com

"SET FOREIGN_KEY_CHECKS = 0;"同等のOracle

外部キー制約のチェックを無効にするMysql固有の命令に相当するものはありますか?
SET FOREIGN_KEY_CHECKS = 0;</ code>

11
abderrahim_05

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
9
Vincent Malgrat

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;

セッションの間、すべての外部キーを無効にする意味はありません。興味があるのはそのうちの2つだけで、どちらもテーブルとともに削除されます。

すべての外部キーをever無効にしたくない場合。

私がこれについて考えることができる他の唯一のコンテキストは、循環参照に何かを挿入したい場合です。その場合、制約をDEFERRABLEとして宣言します。つまり、制約チェックは、実行されるDMLではなくトランザクションの最後に行われます。 ドキュメント を参照してください。

参照が循環的でない場合は、テーブルを別の順序で削除してください。

3
Ben

外部キーを無効にするクエリを要求する場合、これを試してください:

ALTER TABLE mytable
CONSTRAINT fk_mytableを無効にします;

0
Moudiz