Est-il possible de désactiver temporairement les contraintes dans MySQL?
J'ai deux modèles Django, chacun avec une clé étrangère à l'autre. La suppression d'instances d'un modèle renvoie une erreur en raison 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?
mysql
sql
django
django-models
juil
la source
la source
ON DELETE SET NULL
? Cela accomplirait une chose similaire et vous n'auriez pas à activer et désactiver la vérification des clés.Réponses:
Essayez
DISABLE KEYS
ouassurez-vous de
après.
la source
disable keys
pour InnodbPour désactiver globalement la contrainte de clé étrangère, procédez comme suit:
et n'oubliez pas de le remettre en place lorsque vous avez terminé
AVERTISSEMENT: vous ne devez effectuer cette opération que lorsque vous effectuez une maintenance en mode utilisateur unique. Comme cela pourrait entraîner une incohérence des données. Par exemple, cela sera très utile lorsque vous téléchargez une grande quantité de données à l'aide d'une sortie mysqldump.
la source
SET FOREIGN_KEY_CHECKS
change la valeur de la connexion actuelle , tandis queSET GLOBAL ..
change la valeur de toutes les connexions , y compris les futures connexions. Si vous ne faites queSET FOREIGN..
dans une fenêtre, puis essayez d'appliquer l'instruction dans une fenêtre différente (via une connexion différente), la valeur n'a pas changé à cet endroit. AvecGLOBAL
, la même variable a la même valeur pour les deux connexions.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
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 à l'avenir:
la source
Au lieu de désactiver votre contrainte, modifiez-la en permanence sur ON DELETE SET NULL. Cela accomplira une chose similaire et vous n'auriez pas à activer et désactiver la vérification des clés. Ainsi:
Lisez ceci ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) et ceci ( http://dev.mysql.com/doc/refman/5.5/en /create-table-foreign-keys.html ).
la source
FOREIGN_KEY_CHECKS
à 0 et le remettre une fois le sale boulot terminé. En outre, il peut se verrouiller pour l'écriture de vos tables.Pour désactiver globalement la contrainte de clé étrangère:
et pour la contrainte de clé étrangère active
la source
Une solution très simple avec phpmyadmin:
la source
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
n'a pas fonctionné pour moi dans PHPMyAdmin car j'ai oublié de décocher la case "Activer la vérification des clés étrangères". Dans PHPMyAdmin, vous pouvez ignorer ces commandes SET et décochez simplement la case.Pour moi, ce
SET FOREIGN_KEY_CHECKS=0;
n'était pas suffisant. J'avais encore uncom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Je devais ajouter
ALTER TABLE myTable DISABLE KEYS;
.Donc:
la source
Si le champ clé est nullable, vous pouvez également définir la valeur sur null avant de tenter de le supprimer:
la source
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 la clé étrangère et cliquer sur Oui pour les exécuter.
Cela vous permettra de supprimer des lignes même s'il existe une contrainte de restriction ON DELETE.
la source
Ce n'est pas une bonne idée de définir une contrainte de clé étrangère à 0, car si vous le faites, votre base de données ne garantirait 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: parce que toutes les valeurs de la colonne enfant doivent être identiques à une valeur de la colonne parent. S'il n'y a pas de contraintes de clé étrangère, une ligne enfant peut avoir une valeur qui n'est pas dans la ligne parent, ce qui entraînerait des données inexactes.
Par exemple, supposons que vous ayez un site Web pour que les étudiants se connectent et que chaque étudiant doit créer un compte en tant qu'utilisateur. Vous avez une table pour les ID utilisateur, avec l'ID utilisateur comme clé primaire; et un autre tableau pour les comptes étudiants, avec l'ID étudiant en colonne. Étant donné que chaque étudiant doit avoir un ID utilisateur, il serait judicieux de faire de l'ID étudiant de la table des comptes étudiants une clé étrangère qui fait 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 étudiant et aucun identifiant 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 vérification de la clé étrangère.
Il est préférable de déterminer la cause de l'erreur. Vous essayez probablement de supprimer d'une ligne parent sans supprimer d'une ligne enfant. Essayez de supprimer de la ligne enfant avant de supprimer de la ligne parent.
la source