क्या MySQL Foreign_key_checks पूरे डेटाबेस को प्रभावित करता है?


201

जब मैं MySQL में इस कमांड को निष्पादित करता हूं:

SET FOREIGN_KEY_CHECKS=0;

क्या यह पूरे इंजन को प्रभावित करता है या यह केवल मेरा वर्तमान लेनदेन है?


15
परीक्षण: mysql में लॉग इन करें: '% FOREIGN%' जैसे चर दिखाएं; SET FOREIGN_KEY_CHECKS = 0; उसके बाद एक अलग कंसोल का उपयोग करके mysql में लॉग इन करें। मैं उस शो वैरिएबल को देख सकता हूं जैसे '% FOREIGN%', ऑफ की बजाय ON है।
शॉन गुयेन

जवाबों:


246

यह सत्र आधारित है, जब आपने अपने प्रश्न में जिस तरह से सेट किया था।

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

इसके अनुसार, FOREIGN_KEY_CHECKSगुंजाइश के लिए "दोनों" है। इसका मतलब यह सत्र के लिए सेट किया जा सकता है:

SET FOREIGN_KEY_CHECKS=0;

या विश्व स्तर पर:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

98

वास्तव में, दो foreign_key_checksचर हैं: एक वैश्विक चर और एक स्थानीय (प्रति सत्र) चर। कनेक्शन पर, सत्र चर को वैश्विक चर के मान से आरंभ किया जाता है।
आदेश SET foreign_key_checksसत्र चर को संशोधित करता है।
वैश्विक चर को संशोधित करने के लिए, का उपयोग करें SET GLOBAL foreign_key_checksया SET @@global.foreign_key_checks

निम्नलिखित मैनुअल अनुभागों से परामर्श करें:
http://dev.mysql.com/doc/refman/5.7/en/use-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -System-variables.html


1
क्या प्रत्येक अनुरोध पर विदेशी_की_चेक करना महंगा पड़ता है? मुझे DB को अपग्रेड करने के लिए एक स्क्रिप्ट मिली है और मैं नहीं चाहूंगा कि कोई भी व्यक्ति उस अपग्रेड के दौरान डिफ़ॉल्ट रूप से विदेशी कुंजी चेक को ओवरराइड करने में सक्षम हो। इसलिए मैं लाखों प्रश्न करूंगा और मुझे आश्चर्य होगा कि क्या कोई SET महत्वपूर्ण होगा या नहीं?
अकी

@ अक्की अगर आप डीबी को अपग्रेड कर रहे हैं, तो मैं कहूंगा कि आप सभी के लिए लॉकिंग एक्सेस बेहतर हैं। कम से कम लिखने के लिए। अन्यथा, आप सभी प्रकार के समवर्ती पहुँच मुद्दों की अपेक्षा कर सकते हैं।
तिशमा

1
महान जवाब और भेद। यह कैसे काम करता है इसके परिणामों को महसूस करना महत्वपूर्ण है। इसका मतलब है कि आप अंतर्राष्ट्रीय स्तर पर सेट नहीं हो सकते हैं foreign_key_checksऔर उसी सत्र में यह उम्मीद करते हैं कि विदेशी कुंजी बाधाओं को अनदेखा किया जाएगा। आपको गैर-वैश्विक चर सेट करने की आवश्यकता है।
टायलर कोलियर

12

जैसा कि रॉन द्वारा समझाया गया है, स्थानीय और वैश्विक दो चर हैं। स्थानीय चर हमेशा उपयोग किया जाता है, और कनेक्शन पर वैश्विक के समान है।

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable

वैश्विक चर सेट करते समय, स्थानीय किसी भी मौजूदा कनेक्शन के लिए नहीं बदला गया है। आपको स्थानीय वैरिएबल को भी फिर से कनेक्ट या सेट करना होगा।

शायद अनजाने, MYSQL विदेशी कुंजियों को लागू नहीं करता है जब FOREIGN_KEY_CHECKS फिर से सक्षम हो। इससे विदेशी कुंजी और चेक चालू होने के बावजूद असंगत डेटाबेस बनाना संभव हो जाता है।

यदि आप चाहते हैं कि आपकी विदेशी चाबियां पूरी तरह से सुसंगत रहें, तो आपको चेक करते समय चाबियों को जोड़ना होगा।


1
क्या आप इस बारे में विस्तार से बता सकते हैं ... "यदि आप चाहते हैं कि आपकी विदेशी कुंजियाँ पूरी तरह से सुसंगत रहें, तो आपको जाँच करते समय चाबियों को जोड़ना होगा।"
user2782001

4
मान लें कि आपके पास संदर्भ आईडी के साथ एक तालिका है, लेकिन कुछ संदर्भित रिकॉर्ड गायब हैं। यदि आप विदेशी कुंजी (FK) जोड़ते हैं, जबकि FOREIGN_KEY_CHECKS चालू है, तो मैसकल एक त्रुटि को बढ़ाएगा और टूटे हुए संदर्भ के कारण FK को जोड़ने से इंकार कर देगा। जब आप विदेशी कुंजी जोड़ते हैं जब FOREIGN_KEY_CHECKS बंद होते हैं, तो बिना त्रुटि के mysql जारी रहता है। जब आप चेक को बाद में सक्षम करते हैं, तब भी कोई त्रुटि नहीं होगी। आपके पास अब एक तालिका है जिसमें असंगत डेटा है, भले ही एक एफके हो। जैसे, FK की मौजूदगी डेटाबेस संगति की कोई गारंटी नहीं है, जब तक कि इसे जोड़ा नहीं गया जबकि FK चेक चालू थे।
बुके वर्स्टिघ

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

यदि आपने ग्लोबल सेट नहीं किया, तो केवल आपका सत्र प्रभावित हुआ था।


1

जब मैं Drupal डेटाबेस को एक नए स्थानीय अपाचे सर्वर पर स्थानांतरित करने की कोशिश कर रहा था (मैं विंडोज़ पर XAMPP का उपयोग कर रहा हूँ) तो वही त्रुटि थी। वास्तव में मुझे इस त्रुटि का अर्थ नहीं पता है, लेकिन नीचे दिए गए चरणों की कोशिश करने के बाद, मैंने त्रुटियों के बिना डेटाबेस को आयात किया। आशा है कि यह मदद कर सकता है:

C: \ xampp \ php \ php.ini पर php.ini को बदलना

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

My.ini को C: \ xampp \ mysql \ bin \ my.ini में बदलना

max_allowed_packet = 1024M

-2

माईसकल क्वेरी ब्राउज़र का उपयोग करने के मामले में, SET FOREIGN_KEY_CHECKS=0;संस्करण 1.1.20 में कोई प्रभाव नहीं पड़ता है। हालाँकि, यह Myql क्वेरी ब्राउज़र 1.2.17 पर ठीक काम करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.