पहले अपने स्कीमा का विश्लेषण और समझने का प्रयास करें। मुझे कोई कारण नहीं दिख रहा है, क्यों 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
नोट:पिछले कुछ दिनों में मैंने एक ही पैटर्न वाले प्रश्न बार-बार देखे हैं। पैटर्न है:एक विदेशी कुंजी जो अन्य तालिका में प्राथमिक कुंजी के एक भाग को संदर्भित करती है। कुछ उदाहरण:
- समस्या क्या है mysql में मेरी टेबल के साथ?
- त्रुटि कोड :1822. विदेशी कुंजी बाधा जोड़ने में विफल
- #1005 (गलती से) :150 "विदेशी कुंजी बाधा गलत तरीके से बनाई गई है")
टिप्पणियों और उत्तरों ने एफके बाधा जांच का समर्थन करने के लिए संदर्भित तालिका पर एक साधारण अनुक्रमणिका को परिभाषित करने का सुझाव दिया। ऐसा मत करो! विचार करें कि क्या आप केवल 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) के रूप में "बंदर" है। दोनों टीमों में से किसका संदर्भ दिया गया है? आप नहीं कह सकते! इसलिए बेहतर होगा कि आप सरल नियमों से चिपके रहें। और विदेशी कुंजी के लिए नियम है:केवल पूर्ण अद्वितीय या प्राथमिक कुंजी का संदर्भ लें। या इससे भी आसान:केवल पूर्ण प्राथमिक कुंजियों का संदर्भ लें। एक विदेशी कुंजी मान को संदर्भित तालिका में एक विशिष्ट पंक्ति की पहचान करनी चाहिए।