web-dev-qa-db-fra.com

"SET FOREIGN_KEY_CHECKS = 0;" Equivalent Oracle

Existe-t-il un équivalent de l'instruction spécifique Mysql qui désactive la vérification des contraintes de clés étrangères?
SET FOREIGN_KEY_CHECKS = 0;</ code>

10
abderrahim_05

Aucune commande dans Oracle ne permet de désactiver toutes les contraintes en même temps.

Cependant, il semble que vous souhaitiez désactiver les contraintes dans le contexte de la suppression de tables. Dans ce cas, vous pouvez utiliser la clause CASCADE CONSTRAINTS pour supprimer les contraintes de référencement d'autres tables en même temps que la table en cours de suppression.

Voici un exemple:

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

SET FOREIGN_KEY_CHECKS = 0; est basé sur la session . Dans un contexte Oracle, je ne peux que vous imaginer avoir besoin de le faire lorsque vous avez des références circulaires.

Vous avez commenté que c'est ce que vous voulez faire:

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

Je suppose que cela signifie que TABLE1 a une clé étrangère référençant TABLE2 et que TABLE2 possède une clé étrangère référençant TABLE1.

Si tel est le cas, alors réponse de Moudiz est correct. Vous voulez désactiver les clés étrangères avant de déposer la table:

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

Inutile de désactiver toutes les clés étrangères pour la durée de la session, vous n'êtes intéressé que par deux d'entre elles, qui seront toutes deux supprimées avec la table.

Vous ne voulez pas jamais désactiver toutes les clés étrangères.

Le seul autre contexte auquel je puisse penser est si vous voulez insérer quelque chose dans votre référence circulaire, auquel cas vous déclareriez la contrainte comme étant DEFERRABLE. Cela signifie que le contrôle de contrainte est effectué à la fin de la transaction plutôt que sur le DML en cours d'exécution, voir la documentation .

Si vos références ne sont pas circulaires, supprimez simplement les tables dans l'ordre inverse.

2
Ben

SI vous demandez une requête pour désactiver une clé étrangère, essayez ceci:

ALTER TABLE mytable
Désactiver CONSTRAINT fk_mytable;

0
Moudiz