Question Comment désactiver temporairement une contrainte de clé étrangère dans MySQL?


Est-il possible de désactiver temporairement les contraintes dans MySQL?

J'ai deux modèles Django, chacun avec un ForeignKey à l'autre. La suppression d'instances d'un modèle renvoie une erreur à cause de la contrainte ForeignKey:

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()  #a foreign key constraint fails here

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

Est-il possible de désactiver temporairement les contraintes et de les supprimer quand même?


455
2018-03-19 14:03


origine


Réponses:


Essayer DISABLE KEYS ou

SET FOREIGN_KEY_CHECKS=0;

assurez-vous de

SET FOREIGN_KEY_CHECKS=1;

après.


1078
2018-03-19 14:07



Pour désactiver globalement la contrainte de clé étrangère, procédez comme suit:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

et n'oubliez pas de le remettre lorsque vous avez terminé

SET GLOBAL FOREIGN_KEY_CHECKS=1;

AVERTISSEMENT: vous ne devez effectuer cela que lorsque vous effectuez une maintenance en mode mono-utilisateur. Cela pourrait entraîner une incohérence des données. Par exemple, il sera très utile lorsque vous téléchargez une grande quantité de données en utilisant une sortie mysqldump.


99
2017-07-07 02:05



Normalement, je ne désactive les contraintes de clé étrangère que lorsque je veux tronquer une table, et comme je reviens toujours à cette réponse, c'est pour moi:

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;

40
2018-03-25 16:48



Au lieu de désactiver votre contrainte, modifiez-la définitivement sur ON DELETE SET NULL. Cela permettra d'accomplir une chose similaire et vous n'aurez pas à activer et désactiver la vérification des clés. Ainsi:

ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints
ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2;

ALTER TABLE tablename1 
  ADD FOREIGN KEY (table2_id) 
        REFERENCES table2(id)
        ON DELETE SET NULL  //add back constraint

ALTER TABLE tablename2 
  ADD FOREIGN KEY (table1_id) 
        REFERENCES table1(id)
        ON DELETE SET NULL //add back other constraint

Avoir une lecture de ceci (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html) et ça (http://dev.mysql.com/doc/refman/5.5/fr/create-table-foreign-keys.html).


22
2018-03-19 14:33



Pour désactiver la contrainte de clé étrangère globalement:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

et pour la contrainte de clé étrangère active

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

5
2018-01-11 09:49



Une solution très simple avec phpmyadmin: dans votre tableau, allez dans l'onglet SQL, après avoir édité la commande SQL que vous voulez exécuter, à côté de GO il y a une case à cocher 'Activer les contrôles de clé étrangère'. Désactivez cette case et lancez votre SQL Il sera ensuite revérifié automatiquement.


3
2018-04-19 04:26



Si le champ clé est nullable, vous pouvez également définir la valeur sur null avant d'essayer de le supprimer:

cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed() 

cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

2
2018-04-30 21:18



Dans phpMyAdmin, vous pouvez sélectionner plusieurs lignes puis cliquer sur l'action de suppression. Vous allez entrer dans un écran qui répertorie les requêtes de suppression, vous pouvez décocher la vérification de clé étrangère, et cliquez sur Oui pour les exécuter.

Cela vous permettra de supprimer des lignes même s'il existe une contrainte de restriction ON DELETE.


0
2017-12-31 10:57



Ce n'est pas une bonne idée de définir une contrainte de clé étrangère sur 0, car si vous le faites, votre base de données ne garantit pas qu'elle ne viole pas l'intégrité référentielle. Cela pourrait conduire à des données inexactes, trompeuses ou incomplètes.

Vous créez une clé étrangère pour une raison: car toutes les valeurs dans la colonne enfant doivent être identiques à une valeur dans la colonne parente. S'il n'y a pas de contrainte de clé étrangère, une ligne enfant peut avoir une valeur qui n'est pas dans la ligne parente, ce qui conduirait à des données inexactes.

Par exemple, disons que vous avez un site Web pour les étudiants à se connecter et chaque étudiant doit s'inscrire pour un compte en tant qu'utilisateur. Vous avez une table pour les ID utilisateur, avec l'ID utilisateur comme clé primaire; et une autre table pour les comptes d'étudiants, avec l'identifiant de l'étudiant en tant que colonne. Étant donné que chaque étudiant doit posséder un ID utilisateur, il est judicieux de faire de l'ID étudiant de la table des comptes étudiants une clé étrangère faisant référence à l'ID utilisateur de la clé primaire dans la table des ID utilisateur. S'il n'y a pas de vérification de clé étrangère, un étudiant pourrait finir par avoir un identifiant d'étudiant et aucun identifiant d'utilisateur, ce qui signifie qu'un étudiant peut obtenir un compte sans être un utilisateur, ce qui est faux.

Imaginez si cela arrive à une grande quantité de données. C'est pourquoi vous avez besoin de la clé étrangère.

Il est préférable de comprendre ce qui cause l'erreur. Très probablement, vous essayez de supprimer d'une ligne parente sans la supprimer d'une ligne enfant. Essayez de supprimer de la ligne enfant avant de supprimer de la ligne parente.


0
2018-01-14 10:21