PhpMyAdmin में विदेशी कुंजी सेट करना?


335

मैं phpMyAdmin का उपयोग कर एक डेटाबेस स्थापित कर रहा हूं। मेरे पास दो मेज हैं ( fooऔर bar), उनकी प्राथमिक कुंजी पर अनुक्रमित । मैं foo_barविदेशी कुंजी के रूप में उनकी प्राथमिक कुंजी का उपयोग करते हुए, उनके बीच एक संबंधपरक तालिका ( ) बनाने की कोशिश कर रहा हूं ।

मैंने इन तालिकाओं को MyISAM के रूप में बनाया है, लेकिन मैंने इन तीनों को InnoDB में बदल दिया है, क्योंकि मैंने पढ़ा है कि MyISAM विदेशी कुंजी का समर्थन नहीं करता है। सभी idक्षेत्र हैं INT(11)

जब मैं foo_barतालिका चुनता हूं , तो "संबंध देखें" लिंक पर क्लिक करें, और एफके कॉलम को सेट करने का प्रयास करें database.foo.idऔर database.bar.id, यह कहता है कि "कोई भी परिभाषित नहीं है!" प्रत्येक स्तंभ के पास।

मैं क्या खो रहा हूँ?

स्पष्टीकरण / अपडेट

सादगी के लिए, मैं phpMyAdmin का उपयोग करना चाहता हूं। मैं वर्तमान में XAMPP का उपयोग कर रहा हूं, जो मुझे PHP / CSS / Javascript पर ध्यान केंद्रित करने के लिए काफी आसान है, और यह phpMyAdmin के साथ आता है।

इसके अलावा, हालांकि मैं अभी तक स्पष्ट विदेशी कुंजी स्थापित नहीं कर पाया हूं, लेकिन मेरे पास एक संबंधपरक तालिका है और इस तरह से जुड़ सकते हैं:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

यह सिर्फ मुझे असहज बनाता है कि डेटाबेस में एफके को स्पष्ट रूप से परिभाषित नहीं किया गया है।

जवाबों:


365

यदि आप संबंध स्थापित करने के लिए phpMyAdmin का उपयोग करना चाहते हैं, तो आपको 2 काम करने होंगे। सबसे पहले, आपको संदर्भ तालिका में विदेशी कुंजी कॉलम पर एक सूचकांक निर्धारित करना होगा (इसलिए foo_bar.foo_id, आपके मामले में)। फिर, रिलेशन व्यू पर जाएं (रेफ़रिंग टेबल में) और संदर्भित कॉलम को चुनें (ताकि आपके मामले में foo.id) और अपडेट और डिलीट एक्शन पर।

मुझे लगता है कि विदेशी कुंजियाँ उपयोगी होती हैं यदि आपके पास एक-दूसरे से जुड़ी कई तालिकाएँ हैं, विशेष रूप से, यदि आप संदर्भ विकल्पों को सही ढंग से सेट करते हैं तो आपकी डिलीट स्क्रिप्ट बहुत कम हो जाएगी।

संपादित करें: सुनिश्चित करें कि दोनों तालिकाओं में InnoDB इंजन चयनित है।


93
युक्ति: आपके टेबल के नीचे संबंधों का दृश्य थोड़ा लिंक है, मेरे लिए इसे पहली बार में ढूंढना कठिन था
म्लाडेन जन्जेटोविक

14
जब तक कि वह लिंक वहां दिखाई न दे, जिस स्थिति में: सुनिश्चित करें कि ऐसा न होने के लिए आपकी तालिका InnoDB प्रकार (phpMyAdmin में संचालन टैब के तहत) की है।
muttley91

4
@ muttley91My तालिका InnoDB है। मैंने डबल-चेक किया। लिंक अभी भी दिखाई नहीं देता है।
afilina

6
@afilina phpMyAdmin के नए संस्करण में, यह "संरचना" टैब के अंदर सबसे ऊपर दिखाई देता है, टैब पंक्ति के ठीक नीचे "ब्राउज़ करें", "संरचना" आदि दिखाता है
Astitva Srivastava

225

phpMyAdmin आपको उनके "संबंधों" दृश्य का उपयोग करके विदेशी कुंजियों को परिभाषित करने देता है। लेकिन चूंकि, MySQL केवल "INNO DB" टेबल पर विदेशी बाधाओं का समर्थन करता है, इसलिए पहला कदम यह सुनिश्चित करना है कि आप जिस टेबल का उपयोग कर रहे हैं वह उस प्रकार की हो।

एक विदेशी कुंजी सेट करने के लिए ताकि CHILD नामक तालिका में PID स्तंभ, ID स्तंभ को PARENT नामक तालिका में संदर्भित करता है, आप निम्न कार्य कर सकते हैं:

  1. दोनों तालिकाओं के लिए, ऑपरेशन टैब पर जाएं और अपने प्रकार को "INNO DB" में बदलें
  2. सुनिश्चित करें कि ID PARENT तालिका की प्राथमिक कुंजी (या कम से कम एक अनुक्रमित स्तंभ) है।
  3. CHILD तालिका में, PID कॉलम के लिए एक इंडेक्स परिभाषित करें।
  4. CHILD तालिका के संरचना टैब को देखने के दौरान, "फ़ील्ड जोड़ें" अनुभाग के ठीक ऊपर "संबंध दृश्य" लिंक पर क्लिक करें।
  5. आपको एक तालिका दी जाएगी जहां प्रत्येक पंक्ति आपके CLIENT तालिका में अनुक्रमित स्तंभ से मेल खाती है। प्रत्येक पंक्ति में पहली ड्रॉपडाउन से आप चुन सकते हैं कि कौन सा TABLE-> अनुक्रमित कॉलम संदर्भ को मिलाएं। PID के लिए पंक्ति में, ड्रॉपडाउन से PARENT-> ID चुनें और GO पर क्लिक करें।

CHILD टेबल पर एक एक्सपोर्ट करके, आपको देखना चाहिए कि PID कॉलम के लिए एक विदेशी कुंजी बाधा बनाई गई है।


2
वाह, बहुत महत्वपूर्ण बात जानना। यह पृष्ठ पहली चीज नहीं थी जिसे मैंने एक विदेशी कुंजी को जोड़ने में मदद के लिए खोजा था, काश यह अधिक बार उल्लिखित होता।
user1299656

86

यह एक विकिपीडिया लेख का सारांश है। यह उन विभिन्न प्रकार के संबंधों को निर्दिष्ट करता है जिन्हें आप PHPmyadmin में निर्धारित कर सकते हैं। मैं इसे यहां रख रहा हूं क्योंकि यह "अपडेट / डिलीट" के लिए विदेशी कुंजी विकल्प सेट करने पर @ नाथन की टिप्पणी के लिए प्रासंगिक है, लेकिन एक टिप्पणी के लिए बहुत बड़ा है - आशा है कि यह मदद करता है।

CASCADE

जब भी मास्टर (संदर्भित) तालिका में पंक्तियों को हटा दिया जाता है (सम्मान अद्यतन किया जाता है), तो एक मिलान वाले विदेशी कुंजी कॉलम के साथ बच्चे (संदर्भित) तालिका की संबंधित पंक्तियों को भी हटा दिया जाएगा (सम्मान अद्यतन)। इसे कैस्केड डिलीट (रिस्पांस अपडेट [2]) कहा जाता है।

प्रतिबंधित

जब एक पंक्ति किसी विदेशी कुंजी तालिका में मौजूद होती है, जो संदर्भित तालिका में मान को संदर्भित करती है, तो मूल्य को अद्यतन या नष्ट नहीं किया जा सकता है। इसी तरह, एक पंक्ति को तब तक नहीं हटाया जा सकता, जब तक कि किसी विदेशी कुंजी तालिका से उसका संदर्भ न हो।

कोई कार्रवाई नहीं

NO ACTION और RESTRICT बहुत समान हैं। NO ACTION और RESTRICT के बीच मुख्य अंतर यह है कि NO ACTION के साथ तालिका को बदलने की कोशिश करने के बाद संदर्भात्मक अखंडता जांच की जाती है। RESTRICT UPDATE या DELETE स्टेटमेंट को निष्पादित करने का प्रयास करने से पहले जाँच करता है। यदि संदर्भात्मक अखंडता जाँच विफल हो जाती है तो दोनों संदर्भात्मक क्रियाएं समान होती हैं: अद्यतन या DELETE कथन में त्रुटि होगी।

पूरा सेट

संदर्भित पंक्ति में विदेशी कुंजी मान NULL के लिए सेट किए जाते हैं जब संदर्भित पंक्ति को अद्यतन या हटा दिया जाता है। यह केवल तभी संभव है जब संदर्भ तालिका में संबंधित कॉलम अशक्त हों। NULL के शब्दार्थ के कारण, विदेशी कुंजी कॉलम में NULLs के साथ एक संदर्भित पंक्ति को संदर्भित पंक्ति की आवश्यकता नहीं होती है।

डिफॉल्ट सेट करें

SET NULL के समान, संदर्भित पंक्ति में विदेशी प्रमुख मान संदर्भित पंक्ति के अद्यतन या हटाए जाने पर कॉलम डिफ़ॉल्ट पर सेट होते हैं।


1
बेहतर अभी तक, MySQL स्रोत प्रलेखन पर सीधे जाएं: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

62

Phpmyadmin में, आप बस इसके GUI द्वारा विदेशी कुंजी निर्दिष्ट कर सकते हैं। तालिका पर क्लिक करें और संरचना टैब पर जाएं। केवल तालिका के नीचे दिए गए संबंध पर संबंध देखें (नीचे दी गई छवि में दिखाया गया है)।

यहां छवि विवरण दर्ज करें

आप प्राथमिक कुंजी द्वारा पास बॉक्स से फोर्जिंग कुंजी असाइन कर सकते हैं। (नीचे चित्र देखें)। और बचाओ

यहां छवि विवरण दर्ज करें

संबंधित SQL क्वेरी स्वचालित रूप से उत्पन्न और निष्पादित होती है।


16

डेटाबेस के लिए नए लोगों के लिए .... और एक मौजूदा तालिका को बदलने की जरूरत है। बहुत सी चीजें बहुत सीधी लगती हैं, लेकिन ए और बी के बीच हमेशा कुछ न कुछ होता है।

कुछ और करने से पहले, इस पर एक नज़र डालें ।

  1. सुनिश्चित करें कि आपके पास P_ID (पैरेंट और चाइल्ड टेबल दोनों पर पेरेंट आईडी) है।
  2. बेशक यह पहले से ही माता-पिता में भरा जाएगा। जरूरी नहीं कि बच्चे में सही और अंतिम तरीके से हो। उदाहरण के लिए P_ID # 3 (शायद बच्चे की तालिका में कई बार मूल P_ID को मूल तालिका में इंगित किया जाएगा)।
  3. SQL टैब पर जाएं (मैं phpMyAdmin का उपयोग कर रहा हूं, अन्य लोगों के समान होना चाहिए) और यह कमांड करें:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. बाल तालिका पर, संरचना से, अंत में संबंधपरक दृश्य पर क्लिक करें। वहां अपना डीबी प्लानिंग खत्म करें। इससे पहले कि यह कैस्केड, प्रतिबंधित आदि के बारे में एक अच्छा जवाब था, बेशक यह कमांड द्वारा किया जा सकता है ...


9

विदेशी कुंजी एक मेज referes के एक गैर प्रधानमंत्री विशेषता एक और के प्रधानमंत्री विशेषता का मतलब * phpMyAdmin में * पहले कॉलम आप एक सूचकांक के रूप में विदेशी कुंजी सेट करना चाहते हैं सेट

इसके बाद RELATION VIEW पर क्लिक करें

वहाँ आप विदेशी कुंजी सेट करने के लिए विकल्प पा सकते हैं


7

InnoDB आपको ALTER TABLE का उपयोग करके एक नई विदेशी कुंजी बाधा तालिका में जोड़ने की अनुमति देता है:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

दूसरी ओर, यदि MyISAM को आपके संदर्भ में InnoDB पर फायदे हैं, तो आप विदेशी कुंजी बाधाओं को बिल्कुल क्यों बनाना चाहते हैं। आप इसे अपने एप्लिकेशन के मॉडल स्तर पर संभाल सकते हैं। बस यह सुनिश्चित कर लें कि जो कॉलम आप विदेशी कुंजी के रूप में उपयोग करना चाहते हैं, उन्हें अनुक्रमित किया गया है!


4
विदेशी प्रमुख बाधाओं ने मुझे बहुत प्रयास और संभावित त्रुटियों से बचाया। उदाहरण के लिए, मान लें कि मैं अपने सिस्टम से किसी उपयोगकर्ता को हटाने जा रहा हूं। मैं कोड लिख सकता हूं जो डेटाबेस में हर जगह को निर्दिष्ट करता है जहां उस उपयोगकर्ता के बारे में डेटा मौजूद है, और इसे हटाने के लिए कहें। लेकिन मुझे हर समय उस डिलीट फंक्शन को अप-टू-डेट रखना पड़ता है। दूसरी ओर, यदि सभी उपयोगकर्ता-संबंधित डेटा में उपयोगकर्ता की आईडी के लिए एक FK है और डिलीट पर कैस्केड करने के लिए सेट है, तो मेरे सभी कोड का कहना है कि "इस उपयोगकर्ता को हटाएं" और डेटाबेस उस सब को हटाने का ध्यान रखेगा जो उसके पास है उस उपयोगकर्ता के लिए एक FK संदर्भ। बहुत क्लीनर बनाए रखने के लिए।
नाथन लॉन्ग

1
@ नथन: यही मैं पोस्ट में कह रहा हूं। आप इसे मॉडल स्तर पर भी संभाल सकते हैं। आप मॉडल से डिलीट कैस्केड पर कार्यान्वित कर सकते हैं।
अंक 12

3
आप लगभग हमेशा अपने डेटाबेस तालिकाओं में संदर्भात्मक अखंडता जोड़ते हैं। डेटाबेस को खराब एप्लिकेशन प्रोग्रामिंग से खुद को बचाना चाहिए। डेटा अखंडता बनाए रखने के लिए अकेले अपने आवेदन पर भरोसा न करें। निश्चित रूप से हमेशा हर नियम के अपवाद हैं, लेकिन मुझे इसके लिए एक नहीं मिला है।
हार्व

4

यह न भूलें कि दो कॉलम में एक ही डेटा प्रकार होना चाहिए।

उदाहरण के लिए यदि एक कॉलम INT का है और दूसरा टाइप टिंटंट का है तो आपको निम्न त्रुटि मिलेगी:

[PID कॉलम] पर विदेशी कुंजी बनाने में त्रुटि (डेटा प्रकार जांचें)


3

चरण 1: आपको अपनी mysql config फाइल (my.cnf या my.ini आपके OS पर निर्भर करता है) के [mysqld] अनुभाग के तहत डिफ़ॉल्ट-स्टोरेज-इंजन = InnoDB को जोड़ना होगा। यहां छवि विवरण दर्ज करें

चरण 2: अब जब आप तालिका बनाते हैं तो आप देखेंगे कि तालिका का प्रकार क्या है: InnoDB

यहां छवि विवरण दर्ज करें

चरण 3: पेरेंट और चाइल्ड टेबल दोनों बनाएं। अब चाइल्ड टेबल खोलें और कॉलम U चुनें जैसे कि विदेशी कुंजी: नीचे दिखाए गए अनुसार एक्शन लेबल से इंडेक्स की का चयन करें।

यहां छवि विवरण दर्ज करें

स्टेप 4: अब उसी चाइल्ड टेबल में रिलेशन व्यू को नीचे की तरफ से देखें, जैसा कि नीचे दिखाया गया है।

यहां छवि विवरण दर्ज करें चरण 5: विदेशी कुंजी के लिए कॉलम U चुनें जैसे ड्रॉप डाउन से पैरेंट कॉलम का चयन करें। dbName.TableName.ColumnName

DELETE और OND UPATE के लिए उचित मान का चयन करें यहां छवि विवरण दर्ज करें


2

पहले संग्रहण इंजन को InnoDB के रूप में सेट करें

पहले संग्रहण इंजन को InnoDB के रूप में सेट करें

तब संबंध दृश्य विकल्प संरचना मेनू में सक्षम करता है

फिर रिलेशन व्यू विकल्प को सक्षम करें


आपका पहला कदम सही है लेकिन आगे के बारे में कृपया चरण दर चरण सभी प्रक्रिया लिखें।
कुणाल शक्तवत

2

यह पुराना धागा है लेकिन उत्तर है क्योंकि यदि किसी के लिए उपयोगी है।

चरण 1 । आपका डीबी संग्रहण इंजन InnoDB पर सेट है

चरण 2 । प्राथमिक तालिका बनाएं

यहां customerप्राथमिक तालिका है और customer_idप्राथमिक कुंजी है

यहां छवि विवरण दर्ज करें

चरण 3 । विदेशी कुंजी तालिका बनाएं और सूचकांक दें

यहां हमारे पास customer_addressesसंबंधित तालिका है और ग्राहक पते संग्रहीत हैं, इसलिए यहां तालिका customer_idके साथ संबंध हैcustomer

नीचे दी गई तालिका बनाते समय हम सीधे सूचकांक का चयन कर सकते हैं

यहां छवि विवरण दर्ज करें

यदि आप टेबल बनाते समय इंडेक्स देना भूल गए हैं , तो आप टेबल के स्ट्रक्चर टैब से नीचे के रूप में इंडेक्स दे सकते हैं।

यहां छवि विवरण दर्ज करें

चरण 4 । एक बार इंडेक्स फ़ील्ड को देने के बाद, संरचना टैब पर जाएं और नीचे के चित्र में दिखाए गए अनुसार रिलेशन व्यू पर क्लिक करें

यहां छवि विवरण दर्ज करें

चरण 5 । अब आप क्या करना चाहते हैं पर DELETE और OND का चयन करें, करंट टेबल से कॉलम चुनें, DB (SAME DB) चुनें, रिलेशन टेबल और प्राइमरी की को उस टेबल से चुनें जैसा कि नीचे दी गई तस्वीर में दिखाया गया है और इसे सेव करें।

यहां छवि विवरण दर्ज करें

अब जांचें कि क्या संबंध सफलतापूर्वक दिए गए हैं, विदेशी तालिका डेटा सूची पर जाएं और विदेशी कुंजी मूल्य पर क्लिक करें, आप प्राथमिक तालिका रिकॉर्ड पर रीडायरेक्ट करेंगे, फिर सफलतापूर्वक बनाया गया संबंध।


0

Https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html पर आधिकारिक MySQL प्रलेखन से :

MySQL को विदेशी कुंजियों और संदर्भित कुंजियों पर अनुक्रमित करने की आवश्यकता होती है ताकि विदेशी कुंजी जांच तेज़ हो सके और टेबल स्कैन की आवश्यकता न हो।


0

PhpMyAdmin के नए संस्करणों में अब " Relation View " विकल्प नहीं है, जिस स्थिति में आपको उसी चीज़ को प्राप्त करने के लिए एक कथन निष्पादित करना होगा। उदाहरण के लिए

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

इस उदाहरण में, यदि कंपनियों की एक पंक्ति हटा दी जाती है, तो उस कंपनी के सभी कर्मचारी भी हटा दिए जाते हैं।

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