basics mysql foreign key constraint with examples
यह ट्यूटोरियल MySQL FOREIGN KEY बाधा की मूल बातें बताता है जैसे कि इसका सिंटैक्स, कैसे जोड़ें, घोषित करें, ड्रॉप करें, और उदाहरणों के साथ इसे बदलें:
बहुत सरल शब्दों में, MySQL में दो या अधिक तालिकाओं को जोड़ने के लिए FOREIGN KEY का उपयोग किया जाता है।
समय में विभिन्न बिंदुओं पर विभिन्न प्रकार के डेटा को क्वेरी और अपडेट करने के लिए MySQL टेबल को कनेक्ट करना होगा। इसलिए, 2 टेबल के बीच एक लिंकिंग बिंदु होना अनिवार्य है।
इस ट्यूटोरियल में, हम विदेशी कुंजी के विभिन्न उपयोगों के बारे में चर्चा करेंगे और इसे कैसे घोषित किया जा सकता है और कैसे बदला जा सकता है, और इसकी समग्र तालिका संरचना में क्या बाधाएँ हैं।
c ++ साक्षात्कार प्रश्न और उत्तर
आप क्या सीखेंगे:
MySQL FOREIGN KEY
वाक्य - विन्यास:
CONSTRAINT {constraintName} FOREIGN KEY (referringColumnName) REFERENCES {referredTable}({referredColumn}) ON UPDATE {reference-option} ON DELETE {reference-option}
ऊपर वाक्य रचना का उपयोग तब किया जाता है जब तालिका निर्माण के दौरान या उसके साथ किसी तालिका के विरुद्ध FOREIGN KEY को निर्दिष्ट किया जाता है वैकल्पिक बयान।
वाक्य रचना के विभिन्न घटकों को समझते हैं:
- बाधा: यह वह प्रतीकात्मक नाम है जिसे हम निर्दिष्ट करना चाहते हैं कि FK की कमी बताई जा रही है। यदि यह छोड़ दिया जाता है, तो MySQL इंजन ऑटो FK बाधा के लिए एक नाम प्रदान करता है।
- रेफ़रलिंग यह वह कॉलम है जो संदर्भित तालिका में कॉलम द्वारा निर्दिष्ट किसी अन्य तालिका में मानों को संदर्भित करेगा।
- संदर्भित तालिका / मूल तालिका: यह उस तालिका के नाम को संदर्भित करता है जिससे मूल्यों को संदर्भित किया जाएगा।
- संदर्भित कॉलम: संदर्भित तालिका में कॉलम का नाम।
- संदर्भ विकल्प: ये ऐसे कार्य हैं जो तस्वीर में आते हैं जब अद्यतन या हटाने की कार्रवाई उस मेज पर की जाती है जो विदेशी कुंजी बाधा रखती है। अद्यतन और DELETE दोनों में एक ही या अलग संदर्भ विकल्प हो सकते हैं।
हम इस ट्यूटोरियल में बाद में विभिन्न संदर्भात्मक अखंडता क्रियाओं के बारे में सीखेंगे।
आइए कर्मचारी / विभाग के उदाहरण का उपयोग करते हुए FOREIGN कुंजी संदर्भ का एक उदाहरण देखें। हम स्तंभों के साथ एक तालिका विभाग बनाएंगे - विभागीय (int और प्राथमिक कुंजी) और विभाग का नाम (varchar)।
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL, departmentName VARCHAR(100));
नीचे के रूप में स्तंभों के साथ एक तालिका कर्मचारी बनाएँ:
स्तंभ | प्रकार |
---|---|
ईद | INT (प्राथमिक कुंजी) |
नाम | वाराह |
dept_id | INT (विदेशी कुंजी) विभाग तालिका से संदर्भित |
पता | वाराह |
उम्र | पूर्णांक |
जन्म तिथि | तारीख |
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE);
जैसा कि आप देख सकते हैं, उपरोक्त कर्मचारी तालिका में, हमने विभाग के टेबल पर विभाग के टेबल से Int और परिभाषित FOREIGN कुंजी के प्रकार टाइप किए हैं।
इसका अनिवार्य रूप से अर्थ है कि कर्मचारी तालिका में विभाग कॉलम में केवल वही मान हो सकते हैं जो विभाग तालिका में हैं।
आइए इन तालिकाओं में डेटा सम्मिलित करने का प्रयास करें और देखें कि कैसे महत्वपूर्ण कुंजी कार्य करता है।
- पहले विभाग की तालिका में एक रिकॉर्ड बनाएं और कर्मचारी तालिका में एक रिकॉर्ड जोड़ें, जो विभाग की तालिका में जोड़े गए रिकॉर्ड की आईडी को संदर्भित करता है।
INSERT INTO department VALUES (1, 'ENGINEERING') --------- INSERT INTO EMPLOYEE VALUES (1, 'AMIT KUMAR', 'MUMBAI', 32, '1988-02-12',1);
आप देखेंगे कि दोनों कथन त्रुटियों के बिना निष्पादित हो जाएंगे।
- अब विभागीय के लिए एक मान का संदर्भ दें जो कि मौजूद नहीं है।
उदाहरण के लिए, नीचे दिए गए क्वेरी स्टेटमेंट में, हम एक गैर-मौजूदा विभाग के साथ एक कर्मचारी बना रहे हैं -10
INSERT INTO EMPLOYEE VALUES (1, 'DARREN JOHNSON', 'CHICAGO', 32, '1988-02-12',10);
- इस परिदृश्य में, हमें नीचे की तरह एक त्रुटि मिलेगी:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`my_sql_foreign_key`.`employee`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`) ON DELETE CASCADE ON UPDATE CASCADE)
इसलिए, मोटे तौर पर, जब FOREIGN KEY संदर्भ परिभाषित किए जाते हैं, तो यह सुनिश्चित करना महत्वपूर्ण है कि जिस तालिका को संदर्भित किया जा रहा है, उसमें संदर्भित होने से पहले डेटा होना चाहिए।
रेफ़रेंशियल इंटीग्रिटी एक्ट्स
आइए समझने की कोशिश करें कि वास्तव में रेफ़रेंशियल इंटीग्रिटी क्या है।
रेफ़रेंशियल इंटिग्रिटी एक साफ़ और सुसंगत स्थिति में डेटा को बनाए रखने में मदद करती है, जहाँ एक दूसरे से संबंधित तालिकाएँ एक प्रमुख कुंजी संबंध होती हैं।
बस कहा गया है, रेफ़रेंशियल इंटिग्रिटी उस एक्शन को संदर्भित करती है जिसे हम डेटाबेस इंजन से लेने की अपेक्षा करते हैं, जब एक तालिका या DELETE संदर्भित तालिका में होता है जिसमें FOREIGN KEY होता है।
उदाहरण के लिए, हमारे कर्मचारी / विभाग उदाहरण में, मान लें कि हम DB में एक निश्चित पंक्ति के लिए विभाग आईडी बदलते हैं। तब कर्मचारी तालिका में सभी संदर्भित पंक्तियों को प्रभावित किया जाएगा। हम विभिन्न प्रकार के रेफ़रेंशियल इंटीग्रिटी परिदृश्यों को परिभाषित कर सकते हैं जिन्हें ऐसे मामलों के दौरान लागू किया जा सकता है।
ध्यान दें: प्रासंगिक अखंडता को FOREIGN KEY सेटअप / घोषणा के दौरान ON DELETE और ON UPDATE कमांड / सेक्शन के हिस्से के रूप में परिभाषित किया गया है।
यहां एक नमूना क्वेरी का संदर्भ लें (कर्मचारी / विभाग उदाहरण के लिए):
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL, departmentName VARCHAR(100)); CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE {ref-integrity-action} ON DELETE {ref integrity action});
नीचे इन तालिकाओं में कुछ डेटा डालें:
INSERT INTO department VALUES (1, 'ENGINEERING'), (2,'ACCOUNTING'), (3, 'MARKETING'), (4, 'HR'), (5, 'LEGAL'); INSERT INTO EMPLOYEE VALUES (1, 'AMIT KUMAR', 'MUMBAI', 32,'1988-02-12',1), (2, 'RYAN HILMAN', 'SEATTLE',43, '1977-03-15',1), (3, 'KAVITA SINGH', 'DELHI', 42, '1978-02-18',4), (4, 'DAVID BECKHAM', 'LONDON', 40, '1980-07-13',3), (5, 'PRITI KUMARI', 'DELHI', 35, '1985-12-11',2), (6, 'FRANK BALDING', 'NEW YORK', 35, '1985-08-25',5)
4 संदर्भ क्रियाएँ हैं जो MySQL द्वारा समर्थित हैं। आइए उनमें से प्रत्येक को समझने की कोशिश करें।
(1) कैस्केड
यह सबसे अधिक इस्तेमाल की जाने वाली Referential Integrity Actions में से एक है। DELETE और UPDATE को CASCADE पर सेट करने से संदर्भित तालिका में किए गए परिवर्तन लागू होंगे, अर्थात् कर्मचारी / विभाग उदाहरण में। मान लीजिए कि किसी व्यक्ति ने विभाग की तालिका में एक पंक्ति हटा दी है, जिसमें विभाग_नाम = स्वीकार करने के लिए कहा गया है, तो विभागीय तालिका में सभी पंक्तियों में विभाग_एड के रूप में लेखा तालिका भी हटा दी जाएगी।
इसे एक उदाहरण से समझते हैं:
SELECT * FROM employee;
ईद | नाम | पता | उम्र | जन्म तिथि | विभाग |
---|---|---|---|---|---|
एक | अमित कुमार | मुंबई | 32 | 1988-02-12 | एक |
दो | रयान हिलमैन | सिएटल | ४३ | 1977-03-15 | एक |
३ | KAVITA SINGH | दिल्ली | ४२ | 1978-02-18 | ४ |
४ | डेविड बेकहम | लंडन | ४० | 1980-07-13 | ३ |
५ | PRITI KUMARI | दिल्ली | ३५ | 1985-12-11 | दो |
६ | फ्रैंक बाल्डिंग | न्यूयॉर्क | ३५ | 1985-08-25 | ५ |
विभाग तालिका से रिकॉर्ड हटाएं जहां विभाग का नाम = 'खाता'
ओरेकल एसक्यूएल क्वेरी अनुभवी के लिए सवाल और जवाब का साक्षात्कार करती है
DELETE from DEPARTMENT WHERE departmentName='ACCOUNTING';
अब, चूंकि यह एक CASCADE रेफ़रेंशियल एक्शन है, हम उम्मीद करेंगे कि डिपार्टमेंट 2 = (जो कि is ACCOUNTING 'डिपार्टमेंट के लिए है) की सभी पंक्तियों को भी हटा दिया जाए। चलो फिर से कर्मचारी तालिका पर एक चयन क्वेरी करें।
SELECT * FROM employee;
ईद | नाम | पता | उम्र | जन्म तिथि | विभाग |
---|---|---|---|---|---|
एक | अमित कुमार | मुंबई | 32 | 1988-02-12 | एक |
दो | रयान हिलमैन | सिएटल | ४३ | 1977-03-15 | एक |
३ | KAVITA SINGH | दिल्ली | ४२ | 1978-02-18 | ४ |
४ | डेविड बेकहम | लंडन | ४० | 1980-07-13 | ३ |
६ | फ्रैंक बाल्डिंग | न्यूयॉर्क | ३५ | 1985-08-25 | ५ |
जैसा कि आप ऊपर देख सकते हैं, CASCADE संदर्भात्मक अखंडता के कारण, कर्मचारी तालिका में उन पंक्तियों को हटा दिया गया है जिन्हें FOREIGN KEY के रूप में हटा दिया गया है।
# 2) RESTRICT / NO ACTION
RESTRICT या NO ACTION मोड टेबल पर किसी भी UPDATE या DELETE संचालन की अनुमति नहीं देगा जिसमें कुछ स्तंभों को FOREIGN KEY के रूप में संदर्भित किया जा रहा है।
NO ACTION मोड को टेबल डिक्लेरेशन से केवल UPDATE और ON DELETE क्लॉस को छोड़ कर लागू किया जा सकता है।
आइए एक ही उदाहरण का प्रयास करें और इस मामले में केवल अद्यतन और ऑन-डिफरेंशियल अखंडता कार्रवाई को छोड़ दें।
अब जब हम संदर्भित तालिका में किसी भी प्रविष्टि को हटाने का प्रयास करते हैं, तो हमें एक त्रुटि मिलेगी क्योंकि हमने संदर्भात्मक कार्रवाई को RESTRICT में सेट कर दिया है
DELETE FROM department WHERE departmentName='ACCOUNTING';
यदि आप उपरोक्त DELETE कमांड निष्पादित करने का प्रयास करते हैं तो आपको नीचे कुछ त्रुटि दिखाई देगी।
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`my_sql_foreign_key`.`employee`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`))
# 3) पूरा सेट करें
सेट NULL के साथ, संदर्भित तालिका में किसी भी अद्यतन या DELETE के कारण स्तंभ मान जो कि संदर्भित तालिका में FOREIGN कुंजी के रूप में चिह्नित है के विरुद्ध एक NULL मान अद्यतन किया जाएगा।
इस संदर्भात्मक अखंडता कार्रवाई के साथ, कर्मचारी तालिका की परिभाषा नीचे दी जाएगी:
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON DELETE SET NULL);
नीचे दी गई जानकारी के अनुसार संदर्भित तालिका में एक पंक्ति हटाएं:
DELETE FROM department WHERE departmentName='ACCOUNTING';
अब, इस मामले में, कर्मचारी तालिका में संदर्भित मूल्य NULL पर सेट किया जाएगा। परिणाम देखने के लिए कर्मचारी तालिका पर चयन क्वेरी करें।
SELECT * FROM employee;
ईद | नाम | पता | उम्र | जन्म तिथि | विभाग |
---|---|---|---|---|---|
एक | अमित कुमार | मुंबई | 32 | 1988-02-12 | एक |
दो | रयान हिलमैन | सिएटल | ४३ | 1977-03-15 | एक |
३ | KAVITA SINGH | दिल्ली | ४२ | 1978-02-18 | ४ |
४ | डेविड बेकहम | लंडन | ४० | 1980-07-13 | ३ |
५ | PRITI KUMARI | दिल्ली | ३५ | 1985-12-11 | शून्य |
६ | फ्रैंक बाल्डिंग | न्यूयॉर्क | ३५ | 1985-08-25 | ५ |
# 4) डिफॉल्ट सेट करें
निर्दिष्ट करने के लिए निर्धारित समय सीमा मोड में कॉलम के लिए डिफ़ॉल्ट मान को प्रतिस्थापित करने के परिणामस्वरूप होगा (स्तंभ घोषणा के दौरान निर्दिष्ट), तालिका में किसी भी DELETES की स्थिति में संदर्भित किया जा रहा है।
ध्यान दें - के अनुसार MySQL प्रलेखन SET DEFAULT ऑप्शन को MySQL Parser द्वारा सपोर्ट किया गया है लेकिन InnoDB जैसे DB इंजन को नहीं। भविष्य में इसका समर्थन किया जा सकता है।
हालांकि, इस तरह के व्यवहार का समर्थन करने के लिए, आप SET NULL का उपयोग करने पर विचार कर सकते हैं और तालिका पर एक ट्रिगर को परिभाषित कर सकते हैं जो डिफ़ॉल्ट मान सेट कर सकता है।
पूर्व सारणी कथन का उपयोग करते हुए प्रमुख कुंजी बाधा जोड़ें
बहुत बार ऐसा हो सकता है कि हम किसी मौजूदा तालिका में कोई फ़ॉर-डिज़ाइन कुंजी जोड़ना चाहते हैं जिसमें यह नहीं है।
कर्मचारी और विभाग के उदाहरण के अनुसार, हमने बिना किसी पूर्व प्रमुख बाधा के एक कर्मचारी तालिका बनाई और बाद में हम बाधा का परिचय देना चाहते हैं। इसे ALTER TABLE कमांड का उपयोग करके प्राप्त किया जा सकता है।
आइए इसे एक उदाहरण से समझने की कोशिश करें।
मान लें कि हमारे पास एक कर्मचारी तालिका है, जो क्रिएट कमांड के लिए नीचे दी गई परिभाषा है।
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT);
यहाँ, हमारे पास एक स्तंभ विभाग है, लेकिन कोई कुंजी कुंजी बाधा नहीं है। इस मामले में, यहां तक कि एक विभागीय तालिका के बिना, हम रिकॉर्ड्स सम्मिलित करते समय कोई भी मान निर्दिष्ट कर सकते हैं।
अब, बाद में मान लें कि हमारे पास एक अलग विभाग की तालिका है और हम विभागीय लिंक को कर्मचारी तालिका के रूप में वहां पर जोड़ना चाहते हैं।
ALTER TABLE employee ADD CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE;
यदि इस तालिका में मौजूदा डेटा है तो क्या होगा? क्या हम तालिका को बदल सकते हैं और FOREIGN KEY बाधा डाल सकते हैं?
इसका उत्तर हां में है - हम इस शर्त के साथ कह सकते हैं कि कॉलम में मौजूदा मान जो किसी अन्य तालिका से संदर्भित होने जा रहे हैं, उन मानों को मूल तालिका में ही मौजूद होना चाहिए।
FOREIGN KEY बाधा के बिना एक कर्मचारी तालिका बनाएं, कुछ डेटा जोड़ें, और ALTER कमांड का उपयोग करके एक FOREIGN कुंजी बाधा जोड़ने का प्रयास करें।
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT);
INSERT INTO EMPLOYEE VALUES (1, 'DARREN JOHNSON', 'CHICAGO', 32, '1988-02-12',1); INSERT INTO EMPLOYEE VALUES (2, 'ANITA SHERWIN', 'COLUMBIA', 32, '1988-02-12',10);
एक विभागीय तालिका बनाएं और कर्मचारी तालिका में I deptId ’फ़ील्ड के अनुसार FOREIGN KEY जोड़ें, जैसा कि नीचे दिखाया गया है:
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL DEFAULT 1000, departmentName VARCHAR(100));
इस बिंदु पर, यदि हम FOREIGN कुंजी बाधा जोड़ने का प्रयास करते हैं,
ALTER TABLE employee ADD CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE;
तब हमें एक त्रुटि मिलेगी, क्योंकि कर्मचारी तालिका में कुछ डेटा है, लेकिन संदर्भात्मक अखंडता की कमी को पूरा नहीं किया जा सकता है क्योंकि विभाग तालिका में अभी तक कोई डेटा नहीं है।
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`my_sql_foreign_key`.`#sql-63_87`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`) ON DELETE CASCADE ON UPDATE CASCADE)
FOREIGN KEY की बाधा होने के लिए, हमें सबसे पहले विभाग की तालिका में डेटा जोड़ना होगा। डिपार्टमेंट टेबल में आवश्यक रिकॉर्ड डालें।
INSERT INTO department VALUES (1, 'ENGINEERING'),(10,'ACCOUNTING');
उसी परिवर्तन तालिका कथन को निष्पादित करके FOREIGN कुंजी बाधा फिर से जोड़ें। आप देखेंगे कि इस बार, आदेश सफल है और कर्मचारी तालिका सफलतापूर्वक विभाग विभाग तालिका से पूर्व कुंजी के रूप में विभाग के लिए अद्यतन किया गया है।
एक अग्रणी कुंजी बाधा गिराने
FOREIGN कुंजी बाधा जोड़ने के समान, तालिका से मौजूदा FOREIGN कुंजी बाधा को गिराना / हटाना भी संभव है।
इसे ALTER TABLE कमांड का उपयोग करके प्राप्त किया जा सकता है।
वाक्य - विन्यास:
ALTER TABLE {childTable} DROP FOREIGN KEY {foreign key constraint name};
यहाँ table चाइल्डटेबल ’उस तालिका का नाम है जिसमें FOREIGN KEY को परिभाषित किया गया है, जबकि int विदेशी कुंजी बाधा नाम’ वह नाम / प्रतीक है जिसका उपयोग FOREIGN KEY को परिभाषित करने के लिए किया गया था।
आइए कर्मचारी / विभाग तालिका का उपयोग करके एक उदाहरण देखें। कर्मचारी तालिका से I depIdFk ’नामक बाधा को छोड़ने के लिए, नीचे दिए गए आदेश का उपयोग करें:
ALTER TABLE employee DROP FOREIGN KEY depIdFk;
बार बार पूछे जाने वाले प्रश्न
Q # 1) मैं MySQL में विदेशी कुंजी कैसे बदल सकता हूँ?
उत्तर: FOREGIN KEY को ALTER TABLE कमांड का उपयोग करके जोड़ा / हटाया जा सकता है।
नया FOREIGN KEY बदलने या जोड़ने के लिए, आप ALTER कमांड का उपयोग कर सकते हैं और FOREIGN KEY और रेफरेंसिंग टेबल कॉलम को परिभाषित कर सकते हैं जिसे चाइल्ड टेबल से संदर्भित किया जाएगा।
Q # 2) MySQL में कई विदेशी कुंजियाँ कैसे सेट करें?
उत्तर: MySQL की एक तालिका में कई विदेशी कुंजी हो सकती हैं, जो एक ही मूल तालिका या अलग-अलग मूल तालिका पर निर्भर कर सकती हैं।
कर्मचारी / विभाग तालिका का उपयोग करें और विभाग के नाम के साथ ही कर्मचारी तालिका में विभाग के नाम के लिए FOREIGN कुंजी जोड़ें।
नीचे दिए गए दोनों तालिकाओं के बनाएँ बयान देखें
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL DEFAULT 1000, departmentName VARCHAR(100) UNIQUE NOT NULL); ----xxxxx------xxxxx------xxxxx-------xxxxx------xxxxx CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, depName VARCHAR(100), CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT depNameFk FOREIGN KEY (depName) REFERENCES department(departmentName) ON UPDATE CASCADE ON DELETE CASCADE);
Q # 3) MySQL में विदेशी प्रमुख बाधाओं को कैसे निष्क्रिय करें?
उत्तर: जब किसी को संदर्भित किया जा रहा है मौजूदा तालिका को छोटा करने की कोशिश कर रहा है, तो आमतौर पर प्रमुख कुंजी बाधाओं की आवश्यकता होती है। ऐसा करने के लिए, आप नीचे दिए गए आदेश का उपयोग कर सकते हैं:
SET FOREIGN_KEY_CHECKS=0;
यह एक सत्र चर सेट करेगा और FOREIGN_KEY_CHECKS को अस्थायी रूप से अक्षम कर देगा। इस सेटिंग के बाद, आप आगे जा सकते हैं और डिलीट / ट्रंकट का प्रदर्शन कर सकते हैं, जो अन्यथा संभव नहीं होता।
c ++ क्या उपयोग किया जाता है
लेकिन कृपया सुनिश्चित करें कि यह एक व्यवस्थापक विशेषाधिकार है और इसका उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए।
Q # 4) मैं MySQL में टेबल के लिए विदेशी कुंजी संदर्भ कैसे खोज सकता हूं?
उत्तर: मौजूद सभी प्रमुख कुंजी बाधाओं को सूचीबद्ध करने के लिए, आप 'INNODB_FOREIGN_COLS' तालिका का उपयोग ATION INFORMATION_SCHEMA` में कर सकते हैं।
किसी दिए गए MySQL सर्वर उदाहरण के लिए मौजूदा सभी प्रमुख कुंजी घोषणाओं को प्राप्त करने के लिए बस नीचे दी गई कमांड को चलाएं।
ईद | FOR_COL_NAME | REF_COL_NAME | स्थिति |
---|---|---|---|
my_sql_foreign_key / depIdFk | विभाग | विभाग ने आई.डी. | एक |
Q # 5) क्या संदर्भित तालिका में FOREIGN KEY के रूप में संदर्भित कॉलम एक प्राथमिक कुंजी होनी चाहिए?
उत्तर: FOREIGN KEY की परिभाषा के अनुसार, यह आवश्यक होगा कि स्तंभ जिसे FOREIGN KEY के रूप में संदर्भित किया जा रहा है, वह तालिका से PRIMARY KEY होनी चाहिए, जहां इसे संदर्भित किया जा रहा है।
हालाँकि, MySQL के नए संस्करणों के साथ और InnoDB डेटाबेस इंजन के साथ, आप एक कॉलम भी देख सकते हैं जिसमें FOREIGN KEY है जिसमें एक UNIQUE बाधा है और जरूरी नहीं कि यह PRIMARY KEY हो।
Q # 6) क्या MySQL में FOREIGN KEY INDEX बनाता है?
उत्तर: प्राथमिक कुंजी और अद्वितीय बाधा दोनों के लिए, MySQL स्वचालित रूप से ऐसे स्तंभों के लिए एक INDEX बनाता है।
चूँकि हम पहले से ही जानते हैं कि FOREIGN KEY संदर्भ केवल उन स्तंभों पर लागू किया जा सकता है जो प्राथमिक कुंजी या स्तंभ हैं, जिनके अनन्य मान हैं, इसलिए सभी स्तंभ जिन्हें FOREIGN KEY के रूप में संदर्भित किया जाता है, उनके विरुद्ध एक अनुक्रमणिका बनाई जाती है।
तालिका पर अनुक्रमणिका देखने के लिए, नीचे दिए गए आदेश का उपयोग करें:
SHOW INDEX from {dbName.tableName};
इसलिए, हमारे कर्मचारी / विभाग के उदाहरण के लिए, हमने विभाग की तालिका से FOREIGN कुंजी के रूप में कर्मचारी में deptId जोड़ा था।
आइए कर्मचारी और विभाग की तालिकाओं में बनाए गए अनुक्रमितों को देखें।
USE my_sql_foreign_key; SHOW INDEX from employee;
टेबल | नॉन_कनीक | Key_name | Seq_in_index | आम नाम | मिलान | प्रमुखता | उप_पार | पैक्ड | शून्य | इंडेक्स_टाइप |
---|---|---|---|---|---|---|---|---|---|---|
कर्मचारी | ० | प्राथमिक | एक | ईद | सेवा मेरे | ० | शून्य | शून्य | BTREE | |
कर्मचारी | एक | depIdFk | एक | विभाग | सेवा मेरे | ० | शून्य | शून्य | हाँ | BTREE |
आप 2 इंडेक्स देख सकते हैं - एक कर्मचारी तालिका के लिए प्राथमिक कुंजी है और एक अन्य फॉरवर्ड कुंजी डिपो के लिए है जो विभाग तालिका से संदर्भित है।
SHOW INDEX from department;
टेबल | नॉन_कनीक | Key_name | Seq_in_index | आम नाम | मिलान | प्रमुखता | उप_पार | पैक्ड | शून्य | इंडेक्स_टाइप |
---|---|---|---|---|---|---|---|---|---|---|
विभाग | ० | प्राथमिक | एक | विभाग ने आई.डी. | सेवा मेरे | ० | शून्य | शून्य | BTREE |
यहां आप देख सकते हैं कि डिपार्टमेंट टेबल के लिए, हमारे पास प्राथमिक कुंजी के लिए केवल 1 इंडेक्स है (जिसे एम्प्लॉयी टेबल में FOREIGN KEY के रूप में संदर्भित किया गया है)।
Q # 7) क्या MySQL में फॉल्स को NULL किया जा सकता है?
उत्तर: हां, उस स्तंभ के लिए NULL होना पूरी तरह से ठीक है जिसके पास किसी अन्य तालिका पर FOREIGN कुंजी निर्भरता है। यह इस तथ्य की ओर भी संकेत करता है कि NULL का वास्तविक मूल्य नहीं है, इसलिए यह माता-पिता की तालिका में मूल्यों के विरुद्ध मिलान / तुलना नहीं है।
निष्कर्ष
इस ट्यूटोरियल में, हमने MySQL डेटाबेस में FOREIGN KEYS का उपयोग करने से संबंधित विभिन्न अवधारणाओं के बारे में सीखा।
FOREIGN KEY अपडेट्स को आसान बनाता है और उचित प्रतिबंधों को हटाता है, लेकिन कभी-कभी इस तरह के बहुत से रिश्तों में सम्मिलन और / या हटाए जाने की पूरी प्रक्रिया काफी बोझिल हो सकती है।
हमने सीखा कि FOREIGN KEY को कैसे बनाया जाता है और हम बच्चे के टेबल से मौजूदा FOREIGN KEY को कैसे अपडेट और ड्रॉप कर सकते हैं। हमने विभिन्न संदर्भात्मक अखंडता क्रियाओं के बारे में भी सीखा और कैसे हम विभिन्न उपलब्ध विकल्पों जैसे कि CASCADE, NO ACTION, SET NULL, आदि का उपयोग करके विभिन्न व्यवहार को प्राप्त कर सकते हैं।
अनुशंसित पाठ
- MySQL उदाहरणों के साथ तालिका ट्यूटोरियल बनाएँ
- MySQL तालिका में सम्मिलित करें - स्टेटमेंट सिंटैक्स और उदाहरण डालें
- कोड उदाहरणों के साथ MySQL क्रिएट ट्यूटोरियल देखें
- MySQL CONCAT और GROUP_CONCAT फ़ंक्शंस उदाहरण के साथ
- प्रोग्रामिंग उदाहरणों के साथ MySQL लेनदेन ट्यूटोरियल
- MySQL यूनिअन - संघ के उदाहरणों के साथ व्यापक ट्यूटोरियल
- विंडोज और मैक के लिए MySQL कैसे डाउनलोड करें
- SQL बनाम MySQL बनाम SQL सर्वर के बीच अंतर (उदाहरण के साथ)