2011-12-16 2 views
151

Quand j'exécuter cette commande MySQL:MySQL foreign_key_checks affecte-t-il toute la base de données?

SET FOREIGN_KEY_CHECKS=0; 

-t-elle une incidence sur le moteur tout ou il est que ma transaction en cours?

+13

test: connectez-vous à mysql: affichez des variables telles que '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Après cela, connectez-vous à mysql en utilisant une console différente. Je peux voir que les variables show comme '% FOREIGN%' sont activées au lieu de OFF. –

Répondre

169

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 cette étude, FOREIGN_KEY_CHECKS est de portée "Les deux". Cela signifie qu'il peut être réglé pour la session:

SET FOREIGN_KEY_CHECKS=0;

ou dans le monde:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

92

En fait, il y a 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 ou SET @@global.foreign_key_checks.

Consultez les sections manuelles 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

+1

Le paramétrage des foreign_key_checks sur chaque requête est-il coûteux? J'ai un script pour mettre à jour la base de données et je ne voudrais pas que quelqu'un d'autre puisse remplacer les contrôles de clé étrangère par défaut pendant cette mise à niveau. Donc, je ferais des millions de requêtes et je me demandais si un SET serait significatif ou non? – Aki

+0

@Aki Si vous mettez à niveau la base de données, je dirais qu'il vaut mieux verrouiller l'accès pour tout le monde. Au moins pour l'écriture. Sinon, vous pouvez vous attendre à toutes sortes de problèmes d'accès simultanés. – tishma

+0

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 GLOBAL 'foreign_key_checks' et que dans cette même session, vous devez ignorer les contraintes de clés étrangères. Vous devez définir la variable non globale. –

7
# will get you the current local (session based) state. 
SHOW Variables WHERE Variable_name='foreign_key_checks'; 

Si vous ne l'avez pas FIXER GLOBALES, que votre session a été affectée.

-1

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ête Mysql 1.2.17

9

Comme expliqué par Ron, il y a deux variables, locale et globale. La variable locale est toujours utilisée et est identique à la variable 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 pas modifiée pour les connexions existantes. Vous devez également vous reconnecter ou définir la variable locale.

Peut-être non 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 contrôles sont activés.

Si vous souhaitez que vos clés étrangères soient complètement cohérentes, vous devez ajouter les clés lorsque la vérification est activée.

+1

Pouvez-vous élaborer sur ... "Si vous voulez que vos clés étrangères soient complètement cohérentes, vous devez ajouter les clés pendant que la vérification est activée." – user2782001

+3

Supposons que vous ayez une table avec des ID de référence, mais que certains enregistrements référencés sont manquants. Si vous ajoutez la clé étrangère (FK) alors que FOREIGN_KEY_CHECKS est sur ON, Mysql déclenche une erreur et refuse d'ajouter le FK, à cause de la référence rompue. Lorsque vous ajoutez la clé étrangère alors que FOREIGN_KEY_CHECKS est désactivé, mysql continue sans erreur. Même si 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 y a 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 si elle a été ajoutée pendant que les contrôles FK étaient actifs. –

Questions connexes