2008-11-04 58 views
25

Tôi đang làm việc trên một dự án và tôi muốn lưu trữ một số thông tin được liệt kê dễ dàng trong một bảng. Kiểu dữ liệu enum của MySql thực hiện chính xác những gì tôi muốn: http://dev.mysql.com/doc/refman/5.0/en/enum.html. Có tương đương trong SQL Server 2005 không?SQL Server 2005 có tương đương với kiểu dữ liệu ENUM của MySql không?

Tôi biết tôi có thể lưu trữ các giá trị có thể có trong một bảng loại bằng một khóa, nhưng tôi không muốn liên kết ngược với nó để mô tả. Tiêu chuẩn cơ sở dữ liệu của chúng tôi không cho phép chúng tôi liên kết trên các trường không phải số nguyên hoặc uniqueidentifier, do đó, lưu trữ các khóa có thể là các ký tự cũng xuất hiện.

Trả lời

23

Tính năng này có phù hợp với bạn không?

Từ http://blechie.com/wtilton/archive/2007/08/24/303.aspx

Tạo bảng ...

MySQL:

ColumnName ENUM('upload', 'open', 'close', 'delete', 'edit', 'add') 
    DEFAULT 'open' 

SQL Server:

ColumnName varchar(10) 
    CHECK(ColumnName IN ('upload', 'open', 'close', 'delete', 'edit', 'add')) 
    DEFAULT 'open' 
+0

Điều đó phù hợp với tôi. Có một mối quan tâm còn lại: có cách nào dễ dàng để biết giá trị hợp lệ nào cho enum mà không chọn ra ràng buộc không? Tôi hiểu rằng có thể không có và tôi sẽ phải đưa ra quyết định dựa trên điều đó. –

+0

Tôi không chắc chắn ý của bạn là "chọn ra" ràng buộc, nhưng bạn có thể kết nối truy vấn hệ thống này vào thứ gì đó có thể sử dụng được cho nhu cầu của bạn. chọn định nghĩa từ sys.check_constraints nơi [name] = 'yourConstraintName' – Nikki9696

+0

Đối với cả ràng buộc ENUM và CHECK, bạn có thể truy vấn bảng hệ thống và bạn nhận được chuỗi có cú pháp đầy đủ chỉ định danh sách giá trị. Sau đó, bạn phải phân tích cú pháp đó để có được danh sách ở định dạng có thể sử dụng. Thật bất tiện khi truy vấn siêu dữ liệu như thể đó là dữ liệu. –

17

Một charact eristic của kiểu dữ liệu ENUM của MySQL là nó chỉ lưu trữ một chỉ số dạng số vào danh sách các giá trị, chứ không phải chính chuỗi đó, trên mỗi hàng. Vì vậy, nó thường lưu trữ hiệu quả hơn. Ngoài ra, hành vi mặc định khi bạn sắp xếp theo cột ENUM là sắp xếp theo chỉ mục số, do đó theo thứ tự các phần tử trong ENUM.

Nikki9696 đề xuất sử dụng cột VARCHAR có ràng buộc CHECK. Điều này thỏa mãn giới hạn của các giá trị cho một danh sách ngắn nhất định các giá trị được phép, nhưng nó không mô phỏng hiệu quả lưu trữ hoặc thứ tự sắp xếp đặc biệt.

Một cách để có được cả hai hành vi là khai báo cột dưới dạng số nguyên khóa ngoài thành bảng tra cứu, trong đó bạn lưu trữ từng chuỗi được phép.

+3

Một lựa chọn tốt hơn nữa mà tôi đã đăng, tôi đồng ý. – Nikki9696

+0

Thay thế tuyệt vời. Cảm ơn bạn. – Sung

+0

Tôi đang bối rối. Đây không phải là chính xác những gì tác giả của câu hỏi nói rằng anh ta không muốn làm (trong đoạn cuối)? –

Các vấn đề liên quan