মাইএসকিউএল বিদেশী_কি_চেকগুলি পুরো ডাটাবেসকে প্রভাবিত করে?


201

যখন আমি এই কমান্ডটি মাইএসকিউএলে চালিত করি:

SET FOREIGN_KEY_CHECKS=0;

এটি পুরো ইঞ্জিনকে প্রভাবিত করে বা এটি কেবল আমার বর্তমান লেনদেন?


15
পরীক্ষা: মাইএসকিএল-এ লগইন করুন: '% বিদেশী%' এর মত চলক দেখান; সেট বিদেশে_কেন_কিচ = 0; এর পরে ভিন্ন কনসোল ব্যবহার করে মাইএসকিএল এ লগইন করুন। আমি দেখতে পাচ্ছি যে '% বিদেশী%' এর মতো শো চলকগুলি বন্ধের পরিবর্তে চালু আছে।
শান এনগুইন

উত্তর:


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/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variables.html


1
প্রতিটি অনুরোধে বিদেশী_কি_চেকগুলি সেট করা ব্যয়বহুল? আমি ডিবি আপগ্রেড করার জন্য একটি স্ক্রিপ্ট পেয়েছি এবং আমি চাই না যে অন্য কেউ এই আপগ্রেডের সময় ডিফল্টরূপে বিদেশী কী চেকগুলি ওভাররাইড করতে সক্ষম হবে। সুতরাং আমি কয়েক মিলিয়ন ক্যোয়ারী করব এবং আমি ভাবছিলাম যে কোনও এসইটি তাৎপর্যযুক্ত হবে কিনা?
আকি

@ আকী আপনি যদি ডিবিটিকে আপগ্রেড করেন তবে আমি বলব যে আপনি সবার জন্য লক অ্যাক্সেসের চেয়ে ভাল। কমপক্ষে লেখার জন্য। অন্যথায়, আপনি সব ধরণের একযোগে অ্যাক্সেস সমস্যা আশা করতে পারেন।
তিশমা

1
দুর্দান্ত উত্তর এবং পার্থক্য। এটি কীভাবে কাজ করে তার পরিণতি উপলব্ধি করা গুরুত্বপূর্ণ to এর অর্থ হল যে আপনি গ্লোবাল সেট করতে পারবেন না 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
আপনি কী আরও বিশদভাবে বলতে পারেন .... "আপনি যদি চান আপনার বিদেশী কীগুলি সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ হয় তবে আপনার চেক চলাকালীন কীগুলি যুক্ত করা দরকার" "
ব্যবহারকারী2782001

4
ধরা যাক আপনার রেফারেন্স আইডির সাথে একটি টেবিল রয়েছে তবে কয়েকটি রেফারেন্স রেকর্ড অনুপস্থিত। আপনি যদি FOREIGN_KEY_CHECKS চালু থাকাকালীন বিদেশী কী (এফকে) যুক্ত করেন, তবে ভাঙ্গা রেফারেন্সের কারণে মাইএসকিএল একটি ত্রুটি উত্থাপন করবে এবং এফকে যুক্ত করতে অস্বীকার করবে। আপনি যখন বিদেশী কী যুক্ত করেন যখন FOREIGN_KEY_CHECKS বন্ধ থাকে, mysql ত্রুটি ছাড়াই চালিয়ে যায়। আপনি পরে চেকগুলি সক্ষম করার পরেও কোনও ত্রুটি হবে না। এফকে থাকা সত্ত্বেও আপনার কাছে এখন বেমানান ডেটা সহ একটি টেবিল রয়েছে। যেমন, এফকে চেক চালু থাকা অবস্থায় এটি যুক্ত না করা হলে কোনও এফকের অস্তিত্ব ডাটাবেস সামঞ্জস্যের কোনও গ্যারান্টি নয়।
বুক ভার্সটিঘ

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

আপনি যদি বিশ্বব্যাপী সেট না করেন তবে কেবলমাত্র আপনার সেশনটি প্রভাবিত হবে।


1

যখন আমি একটি নতুন স্থানীয় অ্যাপাচি সার্ভারে ড্রপাল ডাটাবেস স্থানান্তরিত করার চেষ্টা করেছি (আমি উইন্ডোজ মেশিনে এক্সএএমপিপি ব্যবহার করছি) তখন আমারও একই ত্রুটি হয়েছিল। আসলে আমি এই ত্রুটির অর্থ জানি না, তবে নীচের পদক্ষেপগুলি চেষ্টা করার পরে, আমি ত্রুটি ছাড়াই ডাটাবেসটি আমদানি করেছি। আশা করি এটি সহায়তা করতে পারে:

সিটিতে php.ini পরিবর্তন করা হচ্ছে: \ xampp \ php \ php.ini i

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

সি: \ xampp \ mysql \ bin \ my.ini এ my.ini পরিবর্তন করা হচ্ছে

max_allowed_packet = 1024M

-2

SET FOREIGN_KEY_CHECKS=0;মাইএসকিএল ক্যোয়ারী ব্রাউজার ব্যবহারের ক্ষেত্রে, সংস্করণ 1.1.20-তে কোনও প্রভাব ফেলবে না। যাইহোক, এটি মাইএসকিএল ক্যোয়ারী ব্রাউজার 1.2.17 এ দুর্দান্ত কাজ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.