MySQL में Constraints
Constraint असल में क्या है
Constraint एक नियम है जो आप column पर लगाते हैं ताकि MySQL ख़ुद ग़लत data रखने से मना कर दे। इसे हर column पर खड़े एक security guard की तरह सोचिए: कोई भी value अंदर आने से पहले guard उसे नियम से जाँचता है। अगर value नियम तोड़ती है, तो पूरा insert error के साथ लौटा दिया जाता है।
यह क्यों ज़रूरी है? क्योंकि असली project में data form, import और दूसरे program से आता है — आप हर value ख़ुद जाँच नहीं सकते। Constraints उस जाँच को database के अंदर ले जाते हैं, जहाँ इसे कभी छोड़ा या भुलाया नहीं जा सकता। fee कभी negative नहीं हो सकती, email कभी दोहरा नहीं सकता, student row कभी roll number के बिना नहीं बन सकती। नियम हर बार, अपने-आप लागू होता है।
MySQL में छह constraints हैं जो आप लगातार इस्तेमाल करेंगे: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK और DEFAULT। हर एक क्या रोकता है यह सीख लें, तो लगभग हर असली table का नियम आप संभाल लेंगे।
NOT NULL - खाली value नहीं
NOT NULL column को हमेशा कोई value रखने पर मजबूर करता है। इसके बिना column खाली (NULL) छोड़ा जा सकता है, जो बाद में गणना या comparison के समय अक्सर bug पैदा करता है।
CREATE TABLE students (
roll_no INT NOT NULL,
name VARCHAR(50) NOT NULL
);
-- name गायब होने से यह fail होगा:
INSERT INTO students (roll_no) VALUES (1);ERROR 1364 (HY000): Field 'name' doesn't have a default value
MySQL ने row रोक दी क्योंकि name ज़रूरी है। वह error constraint का काम कर रहा है — इसने अधूरे record को table में आने से पहले ही रोक दिया।
UNIQUE - कोई duplicate नहीं
UNIQUE यह पक्का करता है कि उस column में दो row एक ही value न रखें। यह email, phone number या admission number जैसी चीज़ों के लिए बिल्कुल सही है, जहाँ दोहराव गलती होगी।
CREATE TABLE users (
id INT,
email VARCHAR(80) UNIQUE
);
INSERT INTO users VALUES (1, 'a@site.com');
INSERT INTO users VALUES (2, 'a@site.com'); -- duplicate!ERROR 1062 (23000): Duplicate entry 'a@site.com' for key 'users.email'
दूसरा insert उसी क्षण fail हो गया जब उसने email दोहराने की कोशिश की। आपको ख़ुद duplicate जाँचने की ज़रूरत नहीं पड़ी — database ने इसकी गारंटी दी।
PRIMARY KEY - row की पहचान
PRIMARY KEY वह एक column (या columns का समूह) है जो हर row को विशिष्ट रूप से पहचानता है। यह असल में दो नियम एक में है: UNIQUE + NOT NULL। हर table में ठीक एक होनी चाहिए।
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100)
);अब book_id कभी खाली नहीं हो सकती और कभी दोहरा नहीं सकती। यह वह भरोसेमंद पकड़ बन जाती है जिससे आप किसी ख़ास book को ढूँढते, update करते या जोड़ते हैं। identity column tables को कैसे जोड़ते हैं यह पढ़ने के लिए देखिए primary और foreign key।
FOREIGN KEY - tables जोड़ना
FOREIGN KEY एक table को दूसरी से जोड़ता है। यह कहता है: इस column की value parent table में पहले से मौजूद होनी चाहिए। यही "orphan" row रोकता है, जैसे कोई order जो ऐसे customer की ओर इशारा करे जो है ही नहीं।
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
-- अगर customer 99 customers में नहीं है तो fail:
INSERT INTO orders VALUES (1, 99);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
MySQL ने ऐसे customer के लिए order बनाने से मना कर दिया जो customers table में नहीं है। दोनों tables के बीच का link अपने-आप सुरक्षित रहता है।
CHECK और DEFAULT
CHECK value पर एक शर्त लागू करता है, और DEFAULT तब value देता है जब कोई न दिया गया हो।
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(8,2) CHECK (price >= 0),
stock INT DEFAULT 0
);
INSERT INTO products (id, price) VALUES (1, 250.00);
INSERT INTO products (id, price) VALUES (2, -5.00); -- CHECK failERROR 3819 (HY000): Check constraint 'products_chk_1' is violated.
पहली row चली और उसका stock 0 पर default हो गया। दूसरी row रुक गई क्योंकि negative price CHECK नियम तोड़ती है। दो constraints, चुपचाप साथ काम करते हुए।
सभी constraints के साथ पूरा उदाहरण
यहाँ एक table है जो एक साथ हर constraint इस्तेमाल करती है, ताकि आप देख सकें कि असली code में ये कैसे मिलते हैं।
CREATE TABLE admissions (
adm_no INT PRIMARY KEY, -- UNIQUE + NOT NULL
email VARCHAR(80) UNIQUE NOT NULL, -- न दोहराव, न खाली
class_id INT,
fees DECIMAL(10,2) CHECK (fees >= 0), -- कभी negative नहीं
status VARCHAR(10) DEFAULT 'active', -- auto value
FOREIGN KEY (class_id) REFERENCES classes(id)
);इसे ऊपर से नीचे पढ़िए और हर line आपको बताती है कि data को कौन-सा नियम मानना है। जो कोई बाद में यह table definition पढ़े उसे तुरंत data का आकार और सीमाएँ समझ आ जाती हैं — यह constraints का दूसरा, छिपा हुआ फ़ायदा है।
एक employees table बनाइए जहाँ id primary key हो, email unique व ज़रूरी हो, salary कभी 10000 से कम न हो (CHECK), और एक "department" column का default 'General' हो। फिर salary 5000 वाली row insert करने की कोशिश कीजिए और देखिए constraint उसे कैसे रोकता है।
आम गलतियाँ
- पुराने MySQL पर CHECK के काम करने की उम्मीद। 8.0.16 से पहले यह चुपचाप अनदेखा होता था। अगर CHECK नियम कुछ न करता दिखे तो अपना version जाँचिए।
- गंदे data पर UNIQUE constraint जोड़ना। अगर duplicate पहले से हैं, तो
ALTER TABLEउन्हें हटाने तक मना करेगा। - यह भूलना कि foreign key को मेल खाते data type चाहिए। child और parent column एक ही type के होने चाहिए, वरना MySQL foreign key ठुकरा देता है।
- NULL को 0 या खाली string समझना। NOT NULL, NULL रोकता है, पर तब भी खाली string
''या 0 आने देता है - ज़्यादा चाहिए तो CHECK जोड़िए।
सारांश
- Constraints वे नियम हैं जो MySQL लागू करता है ताकि ग़लत data कभी न रखा जाए।
NOT NULLvalue ज़रूरी करता है;UNIQUEduplicate रोकता है।PRIMARY KEY= UNIQUE + NOT NULL और हर row को पहचानती है।FOREIGN KEYtables जोड़ती है और orphan row रोकती है।CHECKशर्त लागू करता है (MySQL 8.0.16+);DEFAULTvalue भर देता है।
आगे, पहचान के नियमों का फ़र्क विस्तार से समझिए NOT NULL, UNIQUE, CHECK और DEFAULT में, या पहले सही column type चुनिए MySQL data types में।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
UNIQUE और PRIMARY KEY में क्या अंतर है?
PRIMARY KEY हो सकती है और वह कभी NULL नहीं हो सकती। UNIQUE column कई हो सकते हैं, और MySQL में एक UNIQUE column एक NULL रख सकता है। primary key row की मुख्य पहचान है; UNIQUE सिर्फ़ email जैसे अतिरिक्त column को दोहराने से बचाता है।क्या MySQL में CHECK constraint सच में काम करता है?
CHECK पूरी तरह लागू होता है। उस version से पहले MySQL CHECK को पढ़ता तो था पर अनदेखा कर देता था, इसलिए पुराने tutorial कहते हैं कि यह कुछ नहीं करता। MySQL 8.0.16+ पर शर्त तोड़ने वाली row error के साथ रुक जाती है।क्या foreign key column NULL हो सकता है?
NOT NULL न जोड़ें। NULL foreign key का मतलब है "अभी किसी parent row से नहीं जुड़ा", जो optional रिश्तों के लिए उपयोगी है। पर अगर value मौजूद है, तो उसे parent table की किसी मौजूदा value से मेल खाना होगा, वरना insert fail होगा।UNIQUE column में duplicate डालने पर क्या होता है?
क्या पहले से बनी table में constraint जोड़ सकते हैं?
ALTER TABLE इस्तेमाल कीजिए, जैसे ALTER TABLE students ADD CONSTRAINT uq_email UNIQUE (email);। पेच यह है कि अगर मौजूदा data पहले से नियम तोड़ता है (जैसे duplicate email), तो data साफ़ करने तक MySQL constraint जोड़ने से मना कर देगा।