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

SQL Server có tương đương ENUM của MySQL không?


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ểmMySQL ENUMSQL Server CHECK
Lưu trữSố nguyên nội bộ (1,2,3...)Chuỗi văn bản đầy đủ
Kích thước1-2 bytesĐộ dài chuỗi + overhead
Hiệu năngNhanh (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ếpTheo thứ tự định nghĩaTheo alphabet (cần CASE WHEN)
NULLCho 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