Trong MySQL, cột được định nghĩa là PRIMARY KEY **tự động mang ràng buộc NOT NULL**. Việc thêm NOT NULL rõ ràng là dư thừa và không cần thiết.
Quy tắc
PRIMARY KEY = NOT NULL + UNIQUE
- Không cho phép giá trị NULL
- Giá trị phải duy nhất (unique)
- Chỉ có 1 PRIMARY KEY mỗi bảng
Ví dụ minh họa
1. Tạo bảng KHÔNG khai báo NOT NULL cho PK
CREATE TABLE NotNullAddDemo (
Id INT AUTO_INCREMENT,
PRIMARY KEY(Id)
);
2. Kiểm tra cấu trúc (DESC)
DESC NotNullAddDemo;
Kết quả:
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
Cột Null hiển thị NO → **Tự động NOT NULL**.
3. Thử chèn NULL vào PK
INSERT INTO NotNullAddDemo VALUES(NULL);
INSERT INTO NotNullAddDemo VALUES(NULL);
MySQL chấp nhận nhưng **tự gán giá trị AUTO_INCREMENT**: 1, 2.
4. Thử chèn giá trị trùng PK
INSERT INTO NotNullAddDemo VALUES(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
5. Chèn giá trị hợp lệ
INSERT INTO NotNullAddDemo VALUES(3);
INSERT INTO NotNullAddDemo VALUES(NULL); -- Tự thành 4
6. Kết quả cuối
SELECT * FROM NotNullAddDemo;
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
Giải thích hành vi chèn NULL vào PK AUTO_INCREMENT
- MySQL cho phép
INSERT ... VALUES(NULL)cho cột AUTO_INCREMENT - Giá trị NULL được hiểu là "yêu cầu MySQL tự gán giá trị tiếp theo"
- Đây là hành vi đặc biệt của AUTO_INCREMENT, KHÔNG vi phạm NOT NULL
- Giá trị thực tế lưu trong DB là 1, 2, 3, 4... (không phải NULL)
So sánh: PRIMARY KEY vs UNIQUE KEY
| Đặc điểm | PRIMARY KEY | UNIQUE KEY |
|---|---|---|
| NOT NULL tự động | ✅ Có | ❌ Không (cho phép nhiều NULL) |
| Số lượng/bảng | 1 | Nhiều |
| Clustered Index (InnoDB) | ✅ Luôn | ❌ Không (secondary index) |
Best Practice
- KHÔNG viết:
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY - CHỈ viết:
Id INT AUTO_INCREMENT PRIMARY KEY - Ngắn gọn, rõ ràng, tránh dư thừa
- Áp dụng cho cả
PRIMARY KEY (col1, col2)composite key
Lưu ý
Một số công cụ GUI (Workbench, phpMyAdmin) tự thêm NOT NULL khi sinh script - đó là hành vi của công cụ, không phải yêu cầu của MySQL.