2010-03-14 33 views
76

Có cách nào để chỉ định, ví dụ 4 giá trị riêng biệt cho một cột VARCHAR trong MS SQL Server 2008 không?Hạn chế cột varchar() thành giá trị cụ thể?

Ví dụ, tôi cần một cột gọi là Tần số (varchar) mà chỉ chấp nhận 'Hàng ngày', 'Hàng tuần', 'tháng', 'Hàng năm' như giá trị có thể

phải là có thể này để thiết lập trong SQL Server Quản lý Studio khi tạo bảng?

+4

Nếu an toàn giả định rằng sẽ không còn giá trị hợp lệ và sẽ có nhiều hàng trong bảng, tôi sẽ mã hóa các giá trị có thể trong một cái gì đó nhỏ hơn và nhanh hơn varchar(). – Wikser

Trả lời

93

Bạn đã xem xét thêm một số check constraint trên cột đó sẽ hạn chế giá trị? Một cái gì đó như:

CREATE TABLE SomeTable 
(
    Id int NOT NULL, 
    Frequency varchar(200), 
    CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')) 
) 
+2

Cảm ơn bạn - điều này làm việc tuyệt vời. Một thay đổi nhỏ mà tôi phải thực hiện là "Tần số IN ...." phải được đính kèm trong dấu ngoặc đơn. SQL máy chủ phòng thu không thích nó mà không vì lý do nào. – Adam

+1

Trường hợp kiểm tra ràng buộc này có nhạy cảm không? – RWendi

+3

Tôi nghĩ rằng bạn đã bỏ lỡ một tình trạng hôn mê sau dòng thứ 4 'Tần số varchar (200)' – BillOverFlow

45

Bạn muốn có một check constraint.

Ràng buộc kiểm tra xác định giá trị hợp lệ từ biểu thức logic không phải là dựa trên dữ liệu trong cột khác. Đối với ví dụ , phạm vi giá trị cho cột tiền lương có thể bị giới hạn bởi tạo ràng buộc CHECK chỉ cho phép dữ liệu từ $ 15.000 đến 100.000 đô la. Điều này ngăn chặn tiền lương được nhập vượt quá phạm vi mức lương thông thường.

Bạn muốn một cái gì đó như:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency 
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')) 

Bạn cũng có thể thực hiện ràng buộc kiểm tra với các chức năng vô hướng, như mô tả trong các liên kết ở trên, đó là cách tôi muốn làm điều đó.

+0

câu trả lời này là tốt quá .. tại sao chúng ta không thể chấp nhận nhiều hơn một !! :) – Adam

+1

Yup cái này là tốt hơn :), +1 cho rằng –

4

Khi bạn đang chỉnh sửa một bảng
Right Click -> Kiểm tra ràng buộc -> Add -> Gõ cái gì đó như Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly') trong lĩnh vực biểu hiện và một tên chế tốt trong lĩnh vực này (Name).
Bạn đã hoàn tất.

11

Cá nhân, tôi muốn mã hóa nó như tinyint và:

  • Hoặc: thay đổi nó vào văn bản trên máy khách, kiểm tra ràng buộc giữa 1 và 4
  • Hoặc: sử dụng một bảng tra cứu với một chìa khóa nước ngoài

lý do:

  • Nó sẽ mất trung bình 8 byte để lưu trữ văn bản, 1 byte cho t inyint. Hơn hàng triệu hàng, điều này sẽ tạo sự khác biệt.

  • Điều gì về đối chiếu? Có phải "Hàng ngày" giống như "HÀNG NGÀY" không? Phải mất tài nguyên để thực hiện loại so sánh này.

  • Cuối cùng, điều gì xảy ra nếu bạn muốn thêm "Hai tuần một lần" hoặc "Hàng giờ"? Điều này đòi hỏi một thay đổi giản đồ khi bạn chỉ có thể thêm các hàng mới vào một bảng tra cứu.

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