Ограничить столбец 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"? Для такого сравнения требуются ресурсы.

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

gbn
источник
5

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

Денис К
источник