Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:विदेशी कुंजी बाधा जोड़ने में विफल। बाधा के लिए अनुपलब्ध अनुक्रमणिका

पहले अपने स्कीमा का विश्लेषण और समझने का प्रयास करें। मुझे कोई कारण नहीं दिख रहा है, क्यों teamname प्राथमिक कुंजी का हिस्सा होना चाहिए। ID AUTO_INCREMENT . के कारण कॉलम पहले से ही अद्वितीय है विकल्प। तो आप इसे केवल प्राथमिक कुंजी बना सकते हैं।

अब teamname . पर बाधाओं का विश्लेषण करें . यदि दो टीमों का एक ही नाम नहीं हो सकता है, तो आपको एक UNIQUE KEY define परिभाषित करना चाहिए teamname . पर प्रतिबंध . यदि प्रत्येक टीम का एक नाम होना चाहिए, तो आपको एक NOT NULL परिभाषित करना चाहिए teamname . पर प्रतिबंध . इन बाधाओं के साथ teams के रूप में बनाया जा सकता है:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

अब आप teamname . का उपयोग कर सकते हैं teams . में एक पंक्ति की पहचान करने के लिए कॉलम तालिका, और इसे अन्य तालिकाओं में विदेशी कुंजी के रूप में उपयोग कर सकते हैं। players . के लिए आपका कोड तालिका अब काम करेगी (देखें डेमो )।

ध्यान दें कि आमतौर पर एक विदेशी कुंजी किसी अन्य तालिका की प्राथमिक कुंजी का संदर्भ देती है। players तालिका को इस प्रकार परिभाषित किया जाएगा:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

जब आपको किसी खिलाड़ी की टीम का नाम जानने की आवश्यकता होती है, तो आप एक जॉइन का उपयोग करेंगे:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

नोट:पिछले कुछ दिनों में मैंने एक ही पैटर्न वाले प्रश्न बार-बार देखे हैं। पैटर्न है:एक विदेशी कुंजी जो अन्य तालिका में प्राथमिक कुंजी के एक भाग को संदर्भित करती है। कुछ उदाहरण:

टिप्पणियों और उत्तरों ने एफके बाधा जांच का समर्थन करने के लिए संदर्भित तालिका पर एक साधारण अनुक्रमणिका को परिभाषित करने का सुझाव दिया। ऐसा मत करो! विचार करें कि क्या आप केवल teamname . पर एक अनुक्रमणिका परिभाषित करके अपनी समस्या को ठीक करने का प्रयास करते हैं teams . पर तालिका के साथ:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL इसे स्वीकार करेगा (देखें डेमो ) लेकिन आपका स्कीमा एक ही नाम से दो टीमों को अनुमति देता है। मान लें कि आपके पास "बंदर" नाम की दो टीमें हैं। और आपके पास एक खिलाड़ी है जिसके पास टीम नाम (FK) के रूप में "बंदर" है। दोनों टीमों में से किसका संदर्भ दिया गया है? आप नहीं कह सकते! इसलिए बेहतर होगा कि आप सरल नियमों से चिपके रहें। और विदेशी कुंजी के लिए नियम है:केवल पूर्ण अद्वितीय या प्राथमिक कुंजी का संदर्भ लें। या इससे भी आसान:केवल पूर्ण प्राथमिक कुंजियों का संदर्भ लें। एक विदेशी कुंजी मान को संदर्भित तालिका में एक विशिष्ट पंक्ति की पहचान करनी चाहिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql में IN क्लॉज का उपयोग करने का अलग तरीका

  2. एक कॉलम नंबर का उपयोग करके MySQL में किसी टेबल से कॉलम को कैसे ड्रॉप करें

  3. त्रुटि 1054 (42S22):'फ़ील्ड सूची' में अज्ञात कॉलम '‍'

  4. किसी समय को निकटतम 15 मिनट के खंड में कैसे गोल करें

  5. शामिल होने की शर्तों का क्रम महत्वपूर्ण है?