Primary Key और Foreign Key
Keys क्यों होती हैं
Database शायद ही कभी एक बड़ी table होती है। असली जानकारी कई tables में बँटी होती है — students, courses, teachers, orders — और उन tables को एक-दूसरे से भरोसे के साथ जुड़ना होता है। Keys वही जुड़ाव सुरक्षित बनाती हैं। keys के बिना database सिर्फ़ बिखरी spreadsheet है; keys के साथ यह एक जुड़ा, भरोसेमंद system बन जाता है।
दो keys हैं जिन्हें आपको पहले समझना चाहिए। एक primary key एक table के भीतर बताती है "यह ठीक कौन-सी row है?"। एक foreign key बताती है "यह दूसरी table की कौन-सी row से जुड़ी है?"। मिलकर ये अलग tables को एक जुड़े पूरे में बदल देती हैं जहाँ रिश्ते टूट नहीं सकते।
Primary key को किसी व्यक्ति के unique ID number की तरह सोचिए, और foreign key को उसी ID number को किसी form पर लिखने की तरह जो कहे "यह form उस व्यक्ति का है"।
Primary key: row की पहचान
Primary key एक ऐसा column है जिसकी value हर row के लिए अलग होती है और कभी खाली नहीं होती। यह वह भरोसेमंद पकड़ है जिससे आप किसी एक ख़ास row को ढूँढते, update या delete करते हैं।
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO customers VALUES (1, 'Aarav'), (2, 'Diya');
INSERT INTO customers VALUES (1, 'Kabir'); -- fail, id 1 मौजूद हैERROR 1062 (23000): Duplicate entry '1' for key 'customers.PRIMARY'
MySQL ने तीसरी row ठुकरा दी क्योंकि id 1 पहले से इस्तेमाल है। यही गारंटी — हर id unique और मौजूद — दूसरी tables को सुरक्षित रूप से किसी customer की ओर id से इशारा करने देती है।
Foreign key: tables जोड़ना
Foreign key एक table का वह column है जिसे दूसरी table की किसी primary key value से मेल खाना ज़रूरी है। यह दोनों के बीच link बनाती और उसकी रक्षा करती है।
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(8,2),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);यहाँ orders में customer_id एक foreign key है। इसे ऐसी id रखनी होगी जो customers में पहले से मौजूद हो। यह एक line bugs की पूरी श्रेणी रोक देती है — आप कभी ऐसे customer के लिए order नहीं बना सकते जो है ही नहीं।
दोनों keys को साथ काम करते देखना
सही और ग़लत data insert करके रिश्ते को लागू होते देखिए।
INSERT INTO orders VALUES (101, 1, 500.00); -- ठीक, customer 1 मौजूद INSERT INTO orders VALUES (102, 9, 300.00); -- fail, customer 9 नहीं
Row 101 inserted.
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
पहला order मौजूद customer से साफ़ जुड़ा। दूसरा रुक गया क्योंकि customer 9, customers में नहीं है। primary key ने customer 1 को खोजने योग्य बनाया; foreign key ने link को भरोसेमंद बनाया।
ON DELETE और ON UPDATE
जब customer delete हो तो orders का क्या हो? आप ON DELETE नियमों से तय करते हैं।
| विकल्प | Parent delete होने पर असर |
|---|---|
| RESTRICT (default) | अगर child rows हैं तो delete रोक देता है |
| CASCADE | child rows भी delete कर देता है |
| SET NULL | child foreign key को NULL कर देता है |
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
);ON DELETE CASCADE के साथ, customer 1 को delete करने से उसके सभी order अपने-आप delete हो जाते हैं। शक्तिशाली, पर सोच-समझकर इस्तेमाल कीजिए — deletion child tables तक फैलता है।
एक students और marks जोड़ी बनाइए जहाँ marks.student_id, students.id की foreign key हो ON DELETE CASCADE के साथ। एक student और दो marks insert कीजिए, फिर student delete कीजिए। हर table में कितनी rows बचीं?
Primary key बनाम foreign key
| पहलू | Primary key | Foreign key |
|---|---|---|
| उद्देश्य | row पहचानना | दूसरी table से जोड़ना |
| NULL की अनुमति? | कभी नहीं | हाँ (जब तक NOT NULL न हो) |
| प्रति table कितनी | ठीक एक | कई हो सकती हैं |
| Duplicate value | अनुमति नहीं | अनुमति है |
अंतर पकड़ने का सबसे साफ़ तरीक़ा: primary key row की अपनी पहचान है, जबकि foreign key किसी दूसरी row की पहचान का reference है।
आम गलतियाँ
- मेल न खाते data type। foreign key और जिस primary key की ओर यह इशारा करती है, दोनों एक type के हों, वरना MySQL link ठुकरा देता है।
- Parent से पहले child insert करना। Parent row पहले मौजूद होनी चाहिए, वरना foreign key जाँच fail होती है।
- यह भूलना कि parent का column key होना चाहिए। Foreign key सिर्फ़ primary key या unique column को reference कर सकती है, किसी भी random column को नहीं।
- बिना सोचे CASCADE इस्तेमाल करना। अगर रिश्ते श्रृंखला में जुड़े हों तो यह आपकी सोच से कहीं ज़्यादा delete कर सकता है।
सारांश
- Primary key हर row को विशिष्ट पहचानती है और कभी NULL नहीं — प्रति table एक।
- Foreign key दूसरी table की primary key से जोड़ती है — प्रति table कई।
- Foreign key orphan row रोकती है और रिश्ते अपने-आप मान्य रखती है।
ON DELETE CASCADE / SET NULL / RESTRICTतय करते हैं child rows का क्या हो।- दोनों column का data type मेल खाता होना चाहिए।
आगे, इन columns को नियमों से सुरक्षित कीजिए constraints in MySQL में, या अपनी tables साफ़-सुथरी व्यवस्थित कीजिए normalization in DBMS से।
