Обмежити стовпець varchar () певними значеннями?


94

Чи є спосіб вказати, наприклад, 4 різні значення для стовпця varchar у MS SQL Server 2008?

Наприклад, мені потрібен стовпець "Частота" (varchar), який приймає лише "Daily", "Weekly", "Monthly", "Yearly" як можливі значення.

Чи можливо це встановити в SQL Server Management Studio під час створення таблиці?


5
Якщо можна з упевненістю припустити, що більше не буде дійсних значень і в таблиці буде багато рядків, я б закодував можливі значення в щось менше і швидше, ніж varchar ().
Wikser

Відповіді:


127

Ви вже розглядали додавання в check constraintтой стовпець, який обмежує значення? Щось на зразок:

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

2
Дякую - це спрацювало чудово. Мені довелось внести лише одну невелику зміну: "Частота В ...." теж повинна бути вкладена в дужки. Студії SQL-серверів це не сподобалось без причини.
Адам

1
Чи це обмеження перевіряє регістр?
RWendi

3
Я думаю, ви пропустили кому після 4-го рядкаFrequency varchar(200)
BillOverFlow

RWendi - за замовчуванням сортування SQL Server не враховує регістр, що застосовується на рівні бази даних. Додаткова інформація тут stackoverflow.com/questions/1439485 / ...
jwoe

57

Ви хочете обмеження перевірки .

Обмеження CHECK визначають допустимі значення з логічного виразу, який не базується на даних в іншому стовпці. Наприклад, діапазон значень для стовпця заробітної плати можна обмежити, створивши обмеження CHECK, яке допускає лише дані, які варіюються від 15 000 до 100 000 доларів. Це запобігає надходженню зарплат за межі звичайного діапазону заробітної плати.

Ви хочете щось на зразок:

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

Ви також можете реалізувати обмеження перевірки за допомогою скалярних функцій, як описано в посиланні вище, саме так я вважаю за краще це робити.


1
ця відповідь теж була хорошою .. чому ми не можемо прийняти більше одного !! :)
Адам

1
Так ось цей краще :), +1 за це
Овайс Куреші

11

Особисто я б кодував це як tinyint і:

  • Або: змініть його на текст на клієнті, перевірте обмеження між 1 і 4
  • Або: скористайтеся пошуковою таблицею із зовнішнім ключем

Причини:

  • Для зберігання тексту знадобиться в середньому 8 байт, а для tinyint - 1 байт. Понад мільйони рядків це матиме значення.

  • А як щодо сортування? "Щоденний" - це те саме, що "Щоденний"? Для такого порівняння потрібні ресурси.

  • Нарешті, що, якщо ви хочете додати "Щотижневик" або "Щогодини"? Це вимагає зміни схеми, коли ви можете просто додати нові рядки до таблиці пошуку.


5

Під час редагування таблиці
клацніть правою кнопкою миші -> Перевірити обмеження -> Додати -> Введіть щось на зразок Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')поля виразу та хорошого імені обмеження в поле (Ім'я).
Ви закінчили.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.