ENUM trong MySQL
MySQL hỗ trợ kiểu ENUM nguyên sinh - giới hạn giá trị cho phép:
CREATE TABLE ten_bang (
ten_cot ENUM('GiaTri1','GiaTri2','GiaTri3') DEFAULT 'GiaTri1'
);
Ví dụ MySQL
mysql> CREATE TABLE EnumInMySQL (
-> WebCRUD ENUM('CREATE','READ','UPDATE','DELETE')
-> DEFAULT 'CREATE'
-> );
Query OK, 0 rows affected (0.60 sec)
Tương đương trong SQL Server
SQL Server không có kiểu ENUM. Sử dụng CHECK CONSTRAINT trên cột VARCHAR:
Cú pháp
CREATE TABLE ten_bang (
ten_cot VARCHAR(100)
CHECK (ten_cot IN ('GiaTri1','GiaTri2','GiaTri3'))
DEFAULT 'GiaTri1'
);
Ví dụ SQL Server
CREATE TABLE EnumInSQLServer (
WebCRUD VARCHAR(20)
CHECK (WebCRUD IN ('CREATE','READ','UPDATE','DELETE'))
DEFAULT 'CREATE'
);
So sánh chi tiết
| Đặc điểm | MySQL ENUM | SQL Server CHECK |
|---|---|---|
| Lưu trữ | Số nguyên nội bộ (1,2,3...) | Chuỗi văn bản đầy đủ |
| Kích thước | 1-2 bytes | Độ dài chuỗi + overhead |
| Hiệu năng | Nhanh (so sánh số) | Chậm hơn (so sánh chuỗi) |
| Thay đổi giá trị | ALTER TABLE (phức tạp) | ALTER TABLE DROP/ADD CHECK (dễ hơn) |
| Sắp xếp | Theo thứ tự định nghĩa | Theo alphabet (cần CASE WHEN) |
| NULL | Cho phép (nếu không NOT NULL) | Cho phép (nếu không NOT NULL) |
Giải pháp thay thế tốt hơn cho SQL Server
1. Bảng tham chiếu (Lookup Table) - Khuyên dùng
CREATE TABLE WebCRUD_Lookup (
Code VARCHAR(10) PRIMARY KEY,
Description VARCHAR(100),
SortOrder INT
);
INSERT INTO WebCRUD_Lookup VALUES
('CREATE','Tạo mới',1),
('READ','Đọc',2),
('UPDATE','Cập nhật',3),
('DELETE','Xóa',4);
CREATE TABLE MainTable (
Id INT PRIMARY KEY,
WebCRUD VARCHAR(10)
FOREIGN KEY (WebCRUD) REFERENCES WebCRUD_Lookup(Code)
);
2. User-Defined Type (SQL Server)
CREATE TYPE WebCRUD_Type FROM VARCHAR(10) NOT NULL; -- Ràng buộc CHECK phải thêm ở cấp bảng
Khuyến nghị
- MySQL: ENUM phù hợp cho tập giá trị cố định, nhỏ (< 20 giá trị)
- SQL Server: Dùng Lookup Table + FK cho tính mở rộng, chuẩn hóa
- Tránh ENUM nếu giá trị thường thay đổi hoặc > 50 giá trị
- Cân nhắc CHECK CONSTRAINT cho logic đơn giản, ít thay đổi