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?
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.