MySQL foreign_key_checks affecte-t-il la base de données entière?

201

Lorsque j'exécute cette commande dans MySQL:

SET FOREIGN_KEY_CHECKS=0;

Cela affecte-t-il l'ensemble du moteur ou ce n'est que ma transaction actuelle?

Sean Nguyen
la source
15
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:

98

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.

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

Ron Inbar
la source
1
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.

Bouke Versteegh
la source
1
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.

Mike Karras
la source
1

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

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

Modification de my.ini dans C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M
Saeed cr7
la source
-2

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

user2682955
la source