Ограничить столбец varchar () определенными значениями?


96

Есть ли способ указать, например, 4 различных значения для столбца varchar в MS SQL Server 2008?

Например, мне нужен столбец с именем Frequency (varchar), который принимает только «Ежедневно», «Еженедельно», «Ежемесячно», «Ежегодно» в качестве возможных значений.

Возможно ли это установить в SQL Server Management Studio при создании таблицы?


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

Ответы:


129

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

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

2
Спасибо, это отлично сработало. Однако одно небольшое изменение, которое мне пришлось сделать, заключалось в том, что "Frequency IN ...." тоже нужно было заключить в круглые скобки. Студии SQL-серверов он почему-то не понравился.
Adam

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
этот ответ тоже был хорош ... почему мы не можем принять более одного !! :)
Adam

1
Да, этот лучше :), +1 за это
Овайс Куреши

12

Лично я бы закодировал это как tinyint и:

  • Либо: измените его на текст на клиенте, проверьте ограничение от 1 до 4
  • Или: используйте таблицу поиска с внешним ключом

Причины:

  • В среднем для хранения текста потребуется 8 байт, для tinyint - 1 байт. Это будет иметь значение для миллионов строк.

  • А как насчет сопоставления? "Daily" - это то же самое, что "DAILY"? Для такого сравнения требуются ресурсы.

  • Наконец, что, если вы хотите добавить «Раз в две недели» или «Ежечасно»? Это требует изменения схемы, когда вы можете просто добавлять новые строки в таблицу поиска.


5

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.