Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tại sao không cần thêm NOT NULL cho khóa chính (Primary Key) trong MySQL

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ểmPRIMARY KEYUNIQUE KEY
NOT NULL tự động✅ Có❌ Không (cho phép nhiều NULL)
Số lượng/bảng1Nhiề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.