Thứ Hai, 22 tháng 6, 2026

AUTO_INCREMENT hoạt động ra sao? (Con số tưởng như vô tri, nhưng lại quyết định số phận của rất nhiều bảng dữ liệu)

Số trên bảng số xe tạo ra sao nhỉ? Ai đó sẽ ngồi ghi lại vào sổ tay? Chắc chắn là không rồi. Có rất nhiều "số" trong cuộc sống hàng ngày được tự động tạo theo một qui luật nào đó.


Giả sử...chỉ là giả sử thôi, bạn là "tay mơ", là lính mới toe, bạn tạo bảng đầu tiên trong MySQL.


Ví dụ:

CREATE TABLE users(

id INT AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(100)

);


Bạn thấy:

AUTO_INCREMENT

  • Bạn copy.
  • Bạn paste.
  • Bạn dùng.


6 tháng sau, "le vồ" của bạn đã lên chút đỉnh...


Có người hỏi:

"AUTO_INCREMENT là gì?"


Bạn trả lời:

"Em cũng không rõ..."

"Nhưng đừng xóa nó."



AUTO_INCREMENT là gì?


AUTO_INCREMENT là thuộc tính trong MySQL giúp tự động tăng giá trị của một cột số mỗi khi thêm bản ghi mới.


Thường được dùng cho:

  • ID người dùng
  • ID sản phẩm
  • ID đơn hàng
  • ID bài viết


Ví dụ:

id INT AUTO_INCREMENT

MySQL sẽ tự tạo:

1

2

3

4

5

...

mà bạn không cần nhập tay.



Ví dụ thực tế 

Bạn tới bệnh viện.


Lễ tân phát số thứ tự:

001

002

003

004

005

Người tới sau nhận số lớn hơn.

Không cần tranh cãi.

Không cần bốc lại.


AUTO_INCREMENT hoạt động gần giống như vậy.


Ví dụ...đầu tiên 

Bảng:

users


Dữ liệu:

id username

1 admin

2 nam

3 linh

Bạn chạy lệnh INSERT:

INSERT INTO users(username)

VALUES('hoa');


Kết quả:

id username

4 hoa



Không cần ghi:

id = 4

MySQL tự làm.


Nếu không dùng AUTO_INCREMENT 

Ví dụ:

INSERT INTO users

VALUES(4,'hoa');


Bạn phải tự tính và tự...nhớ.


Một ngày đẹp trời:

VALUES(4,'minh');


Nhưng: 4 đã tồn tại


Phát sinh lỗi: Duplicate entry


Vì sao AUTO_INCREMENT thường đi với PRIMARY KEY?

Ví dụ:

id INT AUTO_INCREMENT PRIMARY KEY

Đây gần như là combo quốc dân.


Vì:

ID

↓

Duy nhất

↓

Không trùng

↓

Dễ tìm kiếm

Rất phù hợp làm khóa chính.


Một hiểu lầm phổ biến 

Lính mới nghĩ:

AUTO_INCREMENT  = Đếm số dòng


Không. Đây là hai thứ khác nhau.


Ví dụ:

id username

1 admin

2 nam

3 hoa


Tổng số dòng: 3


ID cuối: 3

Tạm thời giống nhau.

Nhưng rồi...



Xóa dữ liệu thì sao?

Bạn xóa:

DELETE FROM users

WHERE id=2;


Bảng còn:

id username

1 admin

3 hoa


Bạn thêm:

INSERT INTO users(username)

VALUES('linh');


MySQL tạo:

id username

1 admin

3 hoa

4 linh


Không phải: 2


Mà là: 4


Đây chính là lý do cho phần thảo luận tiếp theo:

Vì sao xóa dữ liệu rồi ID vẫn tăng? 



AUTO_INCREMENT nhớ số cuối ở đâu?

MySQL lưu lại:

Giá trị kế tiếp


Ví dụ:

Đã dùng tới 100

Bản ghi 101 sẽ nhận:

101


Dù:

50

60

70

đã bị xóa.


Có nên dùng ID làm số lượng dữ liệu không?

Chắc chắn là không.


Ví dụ ID lớn nhất:

1000


Không có nghĩa bảng có:

1000 dòng


Có thể:

700 dòng thôi.



Một ví dụ "đau lòng" 

Sếp hỏi:

"Website có bao nhiêu user?"


Bạn trả lời:

SELECT MAX(id)

FROM users;


Kết quả trả về:

5000


Sếp vui vè, hài lòng:

"Ồ, 5000 user. Làm tốt lắm"


Thực tế:

SELECT COUNT(*)

FROM users;


Kết quả:

3127



Tập tành làm web 

Bạn hoàn tất "công trình thế kỷ", sau đó upload website lên host.


Bạn đã tạo bảng:

id INT


Nhưng lại...quên:

AUTO_INCREMENT


Sau vài ngày: Duplicate entry xuất hiện.


Nguyên nhân:

MySQL không tự tăng ID.

Bạn phải tự nhập.


Sự thật biết rồi khổ lắm nói mãi

  • Facebook.
  • Shopee.
  • YouTube.
  • WordPress.


Hầu hết hệ thống lớn đều có:

ID tự tăng

hoặc cơ chế tương tự.


Tuy nhiên các hệ thống cực lớn đôi khi dùng:

UUID

Snowflake ID

Nhưng đó là câu chuyện khác.



Debug kiểu dev "xịn sò"

1. Xem cấu trúc bảng

SHOW CREATE TABLE users;


Kiểm tra:

AUTO_INCREMENT

có tồn tại không.


2. Xem giá trị kế tiếp

Trong phpMyAdmin thường hiển thị:

Auto Increment


3. Đừng tự nhập ID nếu không cần

Ví dụ:

INSERT INTO users(username)

VALUES('hoa');



Thay vì:

INSERT INTO users

VALUES(999,'hoa');




Checklist chuẩn không cần chỉnh 

  • Dùng cho ID
  • Thường đi với PRIMARY KEY
  • Không dùng để đếm số dòng
  • Không tự nhập ID nếu không cần
  • Hiểu rằng ID có thể bị nhảy số
  • Xóa dữ liệu không làm ID quay lại


FAQ nhanh

AUTO_INCREMENT có tự tăng không?

Có 


Xóa ID số 5 rồi thêm mới có dùng lại số 5 không?

Thường là không.


Có nên dùng AUTO_INCREMENT cho khóa chính?

Rất phổ biến.


ID lớn nhất có bằng số dòng không?

Không 



Bạn có thể cũng đang gặp 

Vì sao xóa dữ liệu rồi ID vẫn tăng?

Duplicate Entry là gì?

JOIN là gì?

LIMIT trong MySQL là gì?

Pagination hoạt động ra sao?

Backup database đúng cách


Tổng kết

AUTO_INCREMENT là cơ chế giúp MySQL tự tạo ID mới mỗi khi thêm dữ liệu.


Nó giống như máy phát số thứ tự ở bệnh viện:

  • Người tới sau nhận số lớn hơn.
  • Không cần tranh nhau.
  • Không cần tự tính.


Điều quan trọng nhất cần nhớ là:

AUTO_INCREMENT dùng để tạo ID duy nhất.

Không phải để đếm số dòng.


Và nếu bạn thấy:

1

3

4

8

9

thì đừng hoảng.

MySQL hoàn toàn bình thường.

Chỉ là nó nhớ số tốt hơn chúng ta mà thôi.