Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ทำไม Primary Key ใน MySQL ไม่ต้องระบุ NOT NULL?

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 KEYUNIQUE NOT NULL
จำนวนต่อตาราง1 เท่านั้นหลายอันได้
Clustered Index (InnoDB)ใช่ (ข้อมูลเรียงตาม PK)ไม่ (Secondary index)
Foreign Key Referenceมาตรฐานได้ (แต่ไม่คุ้นเคย)
NULLห้าม (enforced)ห้าม (enforced)