test: connectez-vous à mysql: affichez des variables comme '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Après cela, connectez-vous à mysql en utilisant une autre console. Je peux voir que les variables show comme '% FOREIGN%' sont ON au lieu de OFF.
Sean Nguyen
Réponses:
246
Il est basé sur la session, lorsqu'il est défini comme vous l'avez fait dans votre question.
En fait, il existe deux foreign_key_checksvariables: une variable globale et une variable locale (par session). Lors de la connexion, la variable de session est initialisée à la valeur de la variable globale.
La commande SET foreign_key_checksmodifie la variable de session.
Pour modifier la variable globale, utilisez SET GLOBAL foreign_key_checksou SET @@global.foreign_key_checks.
La définition des Foreign_key_checks sur chaque demande est-elle coûteuse? J'ai un script pour mettre à niveau la base de données et je ne voudrais pas que quelqu'un d'autre puisse remplacer les vérifications de clé étrangère par défaut pendant cette mise à niveau. Je ferais donc des millions de requêtes et je me demandais si un SET serait significatif ou non?
Aki
@Aki Si vous mettez à niveau la base de données, je dirais qu'il vaut mieux verrouiller l'accès pour tout le monde. Du moins pour l'écriture. Sinon, vous pouvez vous attendre à toutes sortes de problèmes d'accès simultanés.
tishma
1
Grande réponse et distinction. Il est important de comprendre les conséquences de son fonctionnement. Cela signifie que vous ne pouvez pas définir le GLOBAL foreign_key_checkset dans cette même session, attendez-vous à ce qu'il ignore les contraintes de clés étrangères. Vous devez définir la variable non globale.
Tyler Collier
12
Comme expliqué par Ron, il existe deux variables, locale et globale. La variable locale est toujours utilisée et est la même que globale lors de la connexion.
SET FOREIGN_KEY_CHECKS=0;SET GLOBAL FOREIGN_KEY_CHECKS=0;
SHOW Variables WHERE Variable_name='foreign_key_checks';# always shows local variable
Lors de la définition de la variable GLOBAL, la variable locale n'est modifiée pour aucune connexion existante. Vous devez également vous reconnecter ou définir la variable locale.
Peut-être pas intuitif, MYSQL n'applique pas les clés étrangères lorsque FOREIGN_KEY_CHECKS est réactivé. Cela permet de créer une base de données incohérente même si les clés étrangères et les vérifications sont activées.
Si vous souhaitez que vos clés étrangères soient parfaitement cohérentes, vous devez ajouter les clés lorsque la vérification est activée.
Pouvez-vous développer ... "Si vous voulez que vos clés étrangères soient parfaitement cohérentes, vous devez ajouter les clés pendant que la vérification est activée."
user2782001
4
Supposons que vous ayez une table avec des identifiants de référence, mais certains enregistrements référencés sont manquants. Si vous ajoutez la clé étrangère (FK) alors que FOREIGN_KEY_CHECKS sont ON, alors Mysql lèvera une erreur et refusera d'ajouter le FK, à cause de la référence cassée. Lorsque vous ajoutez la clé étrangère alors que FOREIGN_KEY_CHECKS est désactivé, mysql continue sans erreur. Même lorsque vous activez les vérifications par la suite, il n'y aura pas d'erreur. Vous avez maintenant une table avec des données incohérentes, même s'il existe un FK. En tant que tel, l'existence d'un FK n'est pas une garantie de cohérence de la base de données, sauf s'il a été ajouté alors que les contrôles FK étaient en cours.
Bouke Versteegh
10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';
Si vous n'avez pas défini GLOBAL, seule votre session a été affectée.
J'ai eu la même erreur lorsque j'ai essayé de migrer la base de données Drupal vers un nouveau serveur Apache local (j'utilise XAMPP sur une machine Windows). En fait, je ne connais pas la signification de cette erreur, mais après avoir essayé les étapes ci-dessous, j'ai importé la base de données sans erreur. J'espère que cela pourrait aider:
En cas d'utilisation du navigateur de requêtes Mysql, SET FOREIGN_KEY_CHECKS=0;n'a aucun impact dans la version 1.1.20. Cependant, cela fonctionne bien sur le navigateur de requêtes Mysql 1.2.17
Réponses:
Il est basé sur la session, lorsqu'il est défini comme vous l'avez fait dans votre question.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
Selon cela,
FOREIGN_KEY_CHECKS
est "Both" pour la portée. Cela signifie qu'il peut être défini pour la session:ou globalement:
la source
En fait, il existe deux
foreign_key_checks
variables: une variable globale et une variable locale (par session). Lors de la connexion, la variable de session est initialisée à la valeur de la variable globale.La commande
SET foreign_key_checks
modifie la variable de session.Pour modifier la variable globale, utilisez
SET GLOBAL foreign_key_checks
ouSET @@global.foreign_key_checks
.Consultez les sections de manuel suivantes:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variables.html
la source
foreign_key_checks
et dans cette même session, attendez-vous à ce qu'il ignore les contraintes de clés étrangères. Vous devez définir la variable non globale.Comme expliqué par Ron, il existe deux variables, locale et globale. La variable locale est toujours utilisée et est la même que globale lors de la connexion.
Lors de la définition de la variable GLOBAL, la variable locale n'est modifiée pour aucune connexion existante. Vous devez également vous reconnecter ou définir la variable locale.
Peut-être pas intuitif, MYSQL n'applique pas les clés étrangères lorsque FOREIGN_KEY_CHECKS est réactivé. Cela permet de créer une base de données incohérente même si les clés étrangères et les vérifications sont activées.
Si vous souhaitez que vos clés étrangères soient parfaitement cohérentes, vous devez ajouter les clés lorsque la vérification est activée.
la source
Si vous n'avez pas défini GLOBAL, seule votre session a été affectée.
la source
J'ai eu la même erreur lorsque j'ai essayé de migrer la base de données Drupal vers un nouveau serveur Apache local (j'utilise XAMPP sur une machine Windows). En fait, je ne connais pas la signification de cette erreur, mais après avoir essayé les étapes ci-dessous, j'ai importé la base de données sans erreur. J'espère que cela pourrait aider:
Changer php.ini dans C: \ xampp \ php \ php.ini
Modification de my.ini dans C: \ xampp \ mysql \ bin \ my.ini
la source
En cas d'utilisation du navigateur de requêtes Mysql,
SET FOREIGN_KEY_CHECKS=0;
n'a aucun impact dans la version 1.1.20. Cependant, cela fonctionne bien sur le navigateur de requêtes Mysql 1.2.17la source