SQL Server tương đương với kiểu dữ liệu enum của MySQL?


Câu trả lời:


155

Nó không. Có một tương đương mơ hồ:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
Tại sao không sử dụng bảng xác định các giá trị hợp lệ và sau đó sử dụng ràng buộc khóa ngoài thay thế?
Elaskanator

@Elaskanator Tôi muốn nói điều này chính xác nhất trả lời OP trực tiếp, trong khi giải pháp tốt nhất cho nó có lẽ là sử dụng bảng bên ngoài FK +.
userfuser

Cảm ơn bạn @Elaskanator đã nhắc nhở tôi về điều hiển nhiên ... bình thường hóa dữ liệu và enum dừng lại.
Andrew

88

Giải pháp tốt nhất tôi tìm thấy trong việc này là tạo bảng tra cứu với các giá trị có thể làm khóa chính và tạo khóa ngoại cho bảng tra cứu.


13
Một giải pháp tốt hơn từ góc độ bảo trì hơn là ràng buộc kiểm tra được hiển thị ở trên.
HLGEM

21
Đây là một giải pháp tốt hơn Enums - trong MySQL là tốt.
ypercubeᵀᴹ

2
@ypercube Tại sao nó tốt hơn cho MySQL?
BenR

4
@BenRecord Có một số vấn đề với enums của MySQL: 8 lý do tại sao Kiểu dữ liệu ENUM của MySQL là xấu . Tôi không đồng ý 100% rằng điều đó là xấu nhưng bạn phải hết sức cẩn thận khi sử dụng chúng.
ypercubeᵀᴹ 17/11/14

1
@BenR cũng vậy nếu tôi nhớ lại một cách chính xác, trong chế độ không nghiêm ngặt với MySQL, một enum không hợp lệ có thể được chèn dưới dạng NULL. Dù điều kiện là gì, một nhóm trước đây của tôi có vấn đề với enum MySQL không được chèn và không bị lỗi khi giá trị không được chỉ định trong danh sách giá trị. Một ràng buộc khóa ngoại trên bảng tra cứu sẽ gây ra lỗi. Tôi đồng ý bảng tra cứu là tốt hơn cho MySQL.
Jim Schubert


2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

Trường hợp hiệu suất quan trọng, vẫn sử dụng các giá trị cứng.


1

Tìm thấy cách tiếp cận thú vị này khi tôi muốn triển khai enum trong SQL Server.

Cách tiếp cận được đề cập dưới đây trong liên kết khá hấp dẫn, xem xét tất cả các nhu cầu enum cơ sở dữ liệu của bạn có thể được thỏa mãn với 2 bảng trung tâm.

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
Đây là một biến thể của mô hình chống được gọi là "một bảng (tra cứu) đúng". Cách tiếp cận phù hợp là có bảng riêng cho từng loại enum và sử dụng khóa ngoại (nếu bạn cần tra cứu, đây có thể không phải là trường hợp của enum "thuần túy").
Branko Dimitrijevic

2
Các nhận xét trên trang được liên kết cung cấp sao lưu tốt để sử dụng các bảng riêng lẻ cho mỗi "enum", thay vì những gì câu trả lời này chỉ định
skia.heliou

4
Thật là buồn cười khi hầu hết mọi người sẽ chùn bước trước thiết kế này, nhưng tác giả đặt tên cho bài viết của mình là "Thực hành tốt nhất".
gạch dưới
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.