

Thiết Lập Tăng Tự Động (AUTO_INCREMENT), định danh duy nhất toàn cục (UUID) Trong MySQL
- 07-07-2025
- Toanngo92
- 0 Comments
Dưới đây là phần tiếp theo trong chuỗi bài học DDL, với nội dung thiết lập AUTO_INCREMENT trong MySQL — rất thường gặp trong thực tế khi làm việc với khóa chính kiểu số:
Mục lục
Thiết Lập Tăng Tự Động (AUTO_INCREMENT) Trong MySQL
Trong các ứng dụng cơ sở dữ liệu, AUTO_INCREMENT là một tính năng rất phổ biến được sử dụng để tự động tạo giá trị duy nhất cho mỗi dòng dữ liệu mới — đặc biệt là cho các trường khóa chính (id
, MaSV
, …).
1. AUTO_INCREMENT Là Gì?
AUTO_INCREMENT
là một thuộc tính được áp dụng cho các cột kiểu số nguyên (INT
, BIGINT
, TINYINT
, …) để tự động tăng giá trị mỗi khi có bản ghi mới được thêm vào bảng.
✅ Lợi ích:
- Không cần phải tự nhập giá trị cho khóa chính.
- Đảm bảo không bị trùng lặp giá trị.
- Tiện lợi cho việc tạo mã tự sinh, đặc biệt là các
id
.
2. Cách Sử Dụng AUTO_INCREMENT
Ví dụ cơ bản:
CREATE TABLE Users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
Khi bạn chèn dữ liệu mà không chỉ định id
, MySQL sẽ tự động tạo ra giá trị id
mới bằng cách tăng thêm 1 đơn vị so với giá trị cao nhất hiện tại.
3. Chèn Dữ Liệu Với AUTO_INCREMENT
INSERT INTO Users (username, email)
VALUES ('alice', '[email protected]'),
('bob', '[email protected]');
→ MySQL sẽ tự gán id = 1
cho Alice và id = 2
cho Bob nếu bảng đang trống.
4. Xem Giá Trị AUTO_INCREMENT Hiện Tại
Bạn có thể dùng:
SHOW TABLE STATUS LIKE 'Users';
→ Trường Auto_increment
sẽ cho biết giá trị tiếp theo sẽ được gán.
5. Đặt Giá Trị Bắt Đầu Của AUTO_INCREMENT
Mặc định bắt đầu từ 1
, nhưng bạn có thể thay đổi:
ALTER TABLE Users AUTO_INCREMENT = 1000;
→ Bản ghi kế tiếp sẽ được gán id = 1000
.
6. Xóa hoặc Reset AUTO_INCREMENT
Reset AUTO_INCREMENT về 1 (chỉ khi bảng không có dữ liệu):
ALTER TABLE Users AUTO_INCREMENT = 1;
Hoặc, xóa toàn bộ dữ liệu và reset:
TRUNCATE TABLE Users;
→ Lệnh TRUNCATE
xóa sạch dữ liệu và reset giá trị AUTO_INCREMENT
về mặc định.
7. Một Số Lưu Ý Khi Dùng AUTO_INCREMENT
Lưu ý | Giải thích |
---|---|
✅ Phải dùng cho cột khóa chính hoặc có chỉ mục (INDEX , UNIQUE , …) | |
❌ Chỉ dùng được với một cột duy nhất trong bảng | |
❌ Không áp dụng cho kiểu dữ liệu không phải số nguyên | |
✅ Tốt nhất dùng với kiểu UNSIGNED để tránh âm và mở rộng phạm vi |
8. Kết Luận
AUTO_INCREMENT
giúp đơn giản hóa việc sinh giá trị cho khóa chính, đảm bảo tính duy nhất và không trùng lặp. Đây là một trong những tính năng không thể thiếu khi thiết kế cơ sở dữ liệu cho ứng dụng web, đặc biệt là các hệ thống có danh sách người dùng, sản phẩm, đơn hàng…
Tuyệt vời! Trước khi đến khóa ngoại, chúng ta hãy tìm hiểu về UUID trong MySQL, một khái niệm rất quan trọng khi bạn cần một định danh duy nhất toàn cục (globally unique identifier), thường được dùng thay cho AUTO_INCREMENT
trong các hệ thống phân tán hoặc có yêu cầu bảo mật cao.
9. UUID Là Gì?
- UUID (Universally Unique Identifier) là một chuỗi 128-bit dùng để xác định duy nhất một đối tượng, bất kể hệ thống hoặc thời gian.
- Thường được biểu diễn dưới dạng chuỗi 36 ký tự (bao gồm dấu gạch ngang), ví dụ:
550e8400-e29b-41d4-a716-446655440000
10. Khi Nào Nên Dùng UUID Thay Cho AUTO_INCREMENT?
UUID | AUTO_INCREMENT |
---|---|
Đảm bảo duy nhất toàn cầu | Duy nhất trong phạm vi một bảng |
Không đoán được (tăng độ bảo mật) | Có thể đoán được giá trị tiếp theo |
Dùng tốt trong hệ thống phân tán, nhiều máy | Phù hợp hệ thống nhỏ, đơn máy chủ |
Kích thước lớn hơn, tốc độ truy vấn chậm hơn | Nhanh hơn, nhẹ hơn |
11. Tạo UUID Trong MySQL
MySQL hỗ trợ hàm tích hợp để tạo UUID:
SELECT UUID();
Kết quả:
e.g., 'c9b1b5f8-35e2-11ee-be56-0242ac120002'
12. Tạo Bảng Với UUID Là Khóa Chính
Ví dụ:
CREATE TABLE Products (
id CHAR(36) PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
✅ Kiểu
CHAR(36)
là hợp lý cho UUID ở dạng chuỗi.
13. Thêm Dữ Liệu Với UUID
Bạn có thể chèn dữ liệu bằng cách gọi UUID()
:
INSERT INTO Products (id, name)
VALUES (UUID(), 'Áo sơ mi nam');
14. Tối Ưu UUID Với UUID_SHORT()
Nếu bạn muốn UUID dạng số (ngắn hơn), bạn có thể dùng UUID_SHORT()
:
SELECT UUID_SHORT();
⚠️
UUID_SHORT()
không đảm bảo duy nhất toàn cầu, chỉ duy nhất trên mỗi máy (phụ thuộc vào server_id), và có thể bị trùng nếu dùng sai cách.
15. Gán UUID Làm Giá Trị Mặc Định?
MySQL hiện không hỗ trợ dùng hàm UUID()
làm DEFAULT
trực tiếp trong CREATE TABLE
. Nếu muốn tự sinh UUID, bạn có 2 cách:
Cách 1: Sinh trong ứng dụng (PHP, Laravel, NodeJS…)
// PHP
$uuid = \Ramsey\Uuid\Uuid::uuid4()->toString();
Cách 2: Dùng trigger trong MySQL
DELIMITER $$
CREATE TRIGGER before_insert_product
BEFORE INSERT ON Products
FOR EACH ROW
BEGIN
IF new.id IS NULL THEN
SET new.id = UUID();
END IF;
END$$
DELIMITER ;
16. Lưu UUID Dưới Dạng BINARY (Hiệu năng cao hơn)
UUID ở dạng CHAR(36)
tốn nhiều không gian và truy vấn chậm. Giải pháp: lưu dưới dạng BINARY(16)
.
CREATE TABLE Products (
id BINARY(16) PRIMARY KEY,
name VARCHAR(100)
);
Dùng hàm UUID_TO_BIN()
để chèn, và BIN_TO_UUID()
để đọc:
INSERT INTO Products (id, name)
VALUES (UUID_TO_BIN(UUID()), 'Sản phẩm A');
SELECT BIN_TO_UUID(id), name FROM Products;
9. Tổng Kết
Tùy chọn | Ưu điểm | Nhược điểm |
---|---|---|
AUTO_INCREMENT | Nhanh, đơn giản | Dễ đoán, không phù hợp phân tán |
UUID() + CHAR(36) | Duy nhất toàn cầu, dễ dùng | Tốn dung lượng, truy vấn chậm |
UUID_TO_BIN() | Tối ưu hóa lưu trữ, hiệu năng tốt | Phức tạp hơn khi thao tác |
👉 Nếu bạn đang xây dựng một hệ thống phân tán, cần đồng bộ hóa hoặc chia sẻ dữ liệu giữa nhiều máy chủ, UUID là lựa chọn ưu việt hơn. Nhưng nếu hệ thống đơn giản và quan trọng tốc độ, AUTO_INCREMENT
vẫn là lựa chọn lý tưởng.