MySQL में **प्राइमरी की (PRIMARY KEY) कॉलम पर NOT NULL लिखने की आवश्यकता नहीं है** क्योंकि प्राइमरी की परिभाषा में **अंतर्निहित रूप से NOT NULL शामिल होता है**।
कारण
प्राइमरी की = NOT NULL + UNIQUE का संयोजन है। MySQL स्वचालित रूप से प्राइमरी की कॉलम को NOT NULL बना देता है।
उदाहरण के साथ समझें
NOT NULL लिखे बिना प्राइमरी की बनाएं:
CREATE TABLE NotNullAddDemo (
Id INT AUTO_INCREMENT,
PRIMARY KEY(Id)
);
संरचना जांचें:
DESC NotNullAddDemo;
आउटपुट (Null = NO स्वचालित):
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
Null कॉलम में NO दिखाता है कि NOT NULL स्वचालित लागू है।
रोचक व्यवहार: NULL डालने पर
INSERT INTO NotNullAddDemo VALUES(NULL);
INSERT INTO NotNullAddDemo VALUES(NULL);
MySQL NULL को अगले ऑटो_इन्क्रीमेंट मान (1, 2) में बदल देता है।
अब 1 डालने का प्रयास:
INSERT INTO NotNullAddDemo VALUES(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
क्योंकि पहला NULL → 1 बन गया था।
3 डालें - काम करेगा:
INSERT INTO NotNullAddDemo VALUES(3);
INSERT INTO NotNullAddDemo VALUES(NULL); -- 4 बनेगा
अंतिम डेटा:
SELECT * FROM NotNullAddDemo;
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
NOT NULL लिखने का प्रभाव
-- ये दोनों समान हैं:
CREATE TABLE t1 (id INT PRIMARY KEY);
CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY);
दोनों में id NOT NULL होगा। NOT NULL लिखना **रिडंडेंट (अतिरिक्त)** है लेकिन हानिकारक नहीं।
कब NOT NULL लिखना समझदारी है?
- दस्तावेजीकरण: इरादा स्पष्ट करने के लिए (टीम कन्वेंशन)
- नॉन-प्राइमरी की कॉलम: जो NOT NULL होने चाहिए
CHANGE COLUMNसे कॉलम परिभाषा बदलते समय
नोट
- यह व्यवहार सभी प्रमुख RDBMS में समान है (PostgreSQL, SQL Server, Oracle)
- यूनिक कंस्ट्रेंट NULL अनुमति देता है (एकाधिक NULL), प्राइमरी की नहीं
SHOW CREATE TABLEमें भी NOT NULL दिखेगा भले न लिखा हो