Primary Key = NOT NULL + UNIQUE อัตโนมัติ
ใน MySQL คอลัมน์ที่เป็น PRIMARY KEY จะมี constraint NOT NULL และ UNIQUE บังคับโดยอัตโนมัติ ไม่ต้องระบุเพิ่ม
ตัวอย่างการทดสอบ
สร้างตาราง Primary Key โดยไม่ระบุ NOT NULL:
CREATE TABLE NotNullAddDemo (
Id INT AUTO_INCREMENT,
PRIMARY KEY(Id)
);
ตรวจสอบโครงสร้างด้วย DESC:
DESC NotNullAddDemo;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
คอลัมน์ Null = NO แปลว่าเป็น NOT NULL แล้ว
พฤติกรรมของ NULL ใน Primary Key (AUTO_INCREMENT)
แม้จะ INSERT NULL ได้ (เพราะ AUTO_INCREMENT) แต่ MySQL จะแปลงเป็นค่าต่อไป:
INSERT INTO NotNullAddDemo VALUES(NULL); -- Id = 1
INSERT INTO NotNullAddDemo VALUES(NULL); -- Id = 2
INSERT INTO NotNullAddDemo VALUES(3); -- Id = 3
INSERT INTO NotNullAddDemo VALUES(NULL); -- Id = 4 (ต่อจากค่าสูงสุด)
พยายาม INSERT ค่าซ้ำ (Error):
INSERT INTO NotNullAddDemo VALUES(1);
-- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
สรุป
- Primary Key = NOT NULL + UNIQUE (โดยนิยามของ Relational Model)
- MySQL enforce ทั้งสองอย่างอัตโนมัติ
- ระบุ
NOT NULLซ้ำได้แต่ไม่จำเป็น (redundant) - AUTO_INCREMENT ทำงานกับ NULL โดยแปลงเป็นค่าลำดับถัดไป
ข้อแตกต่าง: PRIMARY KEY vs UNIQUE NOT NULL
| คุณสมบัติ | PRIMARY KEY | UNIQUE NOT NULL |
|---|---|---|
| จำนวนต่อตาราง | 1 เท่านั้น | หลายอันได้ |
| Clustered Index (InnoDB) | ใช่ (ข้อมูลเรียงตาม PK) | ไม่ (Secondary index) |
| Foreign Key Reference | มาตรฐาน | ได้ (แต่ไม่คุ้นเคย) |
| NULL | ห้าม (enforced) | ห้าม (enforced) |