Hạn chế cột varchar () ở các giá trị cụ thể?


94

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?

Ví dụ: tôi cần một cột có tên là Tần suất (varchar) chỉ chấp nhận các giá trị "Hàng ngày", "Hàng tuần", "Hàng tháng", "Hàng năm" nhất có thể

Điều này có thể đặt trong SQL Server Management Studio khi tạo bảng không?


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

Câu trả lời:


127

Bạn đã xem xét thêm check constraintvào cột đó sẽ hạn chế giá trị chưa? 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 ...." cũng phải được đặt trong dấu ngoặc đơn. SQL server studio không thích nó mà không có lý do gì.
Adam

1
Kiểm tra ràng buộc này có phân biệt chữ hoa và chữ thường không?
RWendi

3
Tôi nghĩ rằng bạn bỏ lỡ một tình trạng hôn mê sau khi dòng thứ 4Frequency varchar(200)
BillOverFlow

RWendi - đối chiếu SQL Server mặc định không phân biệt chữ hoa chữ thường, áp dụng trên cấp cơ sở dữ liệu. Thông tin thêm tại đây stackoverflow.com/questions/1439485/…
jwoe

57

Bạn muốn có một ràng buộc kiểm tra .

Ràng buộc KIỂM TRA xác định các giá trị hợp lệ từ một biểu thức logic không dựa trên dữ liệu trong một cột khác. Ví dụ: có thể giới hạn phạm vi giá trị của cột lương bằng cách tạo ràng buộc KIỂM TRA cho phép chỉ dữ liệu nằm trong khoảng từ 15.000 đô la đến 100.000 đô la. Điều này ngăn chặn việc nhập lương vượt quá phạm vi 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ể triển khai các ràng buộc kiểm tra với các hàm vô hướng, như được mô tả trong liên kết ở trên, đó là cách tôi muốn làm điều đó.


1
câu trả lời này cũng tốt .. 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 tốt hơn :), +1 cho cái đó
Owais Qureshi

11

Cá nhân tôi viết mã nó là tinyint và:

  • Hoặc: thay đổi nó thành 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 bảng tra cứu có khóa ngoại

Lý do:

  • Trung bình sẽ mất 8 byte để lưu trữ văn bản, 1 byte cho tinyint. Trên hàng triệu hàng, điều này sẽ tạo ra sự khác biệt.

  • Đối chiếu thì sao? "Hàng ngày" có giống với "HÀNG NGÀY" không? Cần có nguồn lực để thực hiện loại so sánh này.

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


5

Khi bạn đang chỉnh sửa bảng
Nhấp chuột phải -> Kiểm tra Ràng buộc -> Thêm -> Nhập một cái gì đó giống như Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')trong trường biểu thức và một tên ràng buộc hay vào trường (Tên).
Bạn xong việc rồ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.