Как убедиться, что столбец содержит одно из набора значений?

Я создаю таблицу, которая выглядит примерно так.

CREATE TABLE packages
(
  productCode char(2)
  , name nvarchar(100) 
  , ...
)

Как убедиться, что productCode всегда имеет одно из двух значений: XJ или XD?

Глядя на этот вопрос 7 лет спустя, если бы я повторил это снова, я бы добавил таблицу и внешний ключ. Полезно для документации "что означает XJ?" хранилище данных и лучшая переносимость между СУБД.

Patrick McElhaney 07.03.2015 15:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
315
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий
ALTER TABLE packages
ADD CONSTRAINT constraintname CHECK (productCode in ('XJ', 'XD'))

Я бы посоветовал использовать справочную таблицу для будущего расширения. Вставить еще одну строку в таблицу намного проще, чем выяснить, как восстановить ограничение.

Jon Grant 23.10.2008 22:23

Да, в этом случае я использую ЯГНИ. :-)

Patrick McElhaney 23.10.2008 22:33

Это работает в Oracle, MySQL и т. д.? Я использую MS SQL Server 2000, но если решение довольно стандартное, имеет смысл отметить это и удалить тег sqlserver.

Patrick McElhaney 23.10.2008 22:34

Оракул, да. Mysql - думаю, что нет. Mysql, похоже, хочет наложить ограничение на столбец вместо проверки допустимости строки.

Amy B 23.10.2008 22:49

MySQL не поддерживает ограничения CHECK. Они могут делать нечто подобное со своим проприетарным типом данных ENUM.

Bill Karwin 23.10.2008 23:32

Либо сделайте его иностранный ключ в поисковой таблице, либо добавьте проверить ограничение для его принудительного применения.

CREATE TABLE packages
(
  productCode char(2)
  , name nvarchar(100) 
  , ...
  ,CONSTRAINT productCode CHECK (productCode in ('XJ','XD') )
)

Разве первый «productCode» не должен быть именем ограничения вместо имени столбца?

Patrick McElhaney 23.10.2008 22:35

Это - конечно, вы можете назвать это как угодно, но если я помещаю проверочное ограничение для одного столбца, я обычно просто использую имя столбца.

Bob Probst 23.10.2008 22:46

Здорово. Я всегда предполагал, что ограничение не может иметь то же имя, что и столбец в той же таблице.

Patrick McElhaney 23.10.2008 22:48

В этом случае кажется, что набор значений для ProductCode довольно ограничен, и вы не ожидаете, что он будет расти в обозримом будущем, поэтому я склонен согласиться с ответами checkconstraint. Однако в большинстве случаев я бы реализовал решение с внешним ключом, как было предложено г-ном Грантом, поскольку у моих клиентов есть неприятная привычка менять свое мнение (а также требования) примерно раз в день. В этой ситуации мой срок истекает, потому что версию FK легче поддерживать.

Другие вопросы по теме