Restringir a coluna varchar () a valores específicos?


94

Existe uma maneira de especificar, por exemplo, 4 valores distintos para uma coluna varchar no MS SQL Server 2008?

Por exemplo, preciso de uma coluna chamada Frequência (varchar) que aceita apenas 'Diário', 'Semanal', 'Mensal', 'Anual' como valores possíveis

É possível definir no SQL Server Management Studio ao criar a tabela?


5
Se for seguro presumir que não haverá mais valores válidos e que haverá muitas linhas na tabela, codificaria os valores possíveis em algo menor e mais rápido do que um varchar ().
Wikser

Respostas:


127

Você já olhou como adicionar um check constraintnessa coluna que restringiria os valores? Algo como:

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

2
Obrigado - funcionou muito bem. Uma pequena mudança que eu tive que fazer foi que "Frequency IN ...." teve que ser colocado entre parênteses também. O SQL Server Studio não gostou sem por algum motivo.
Adam

1
Esta restrição de verificação diferencia maiúsculas de minúsculas?
RWendi

3
Acho que você perdeu o coma após a 4ª linhaFrequency varchar(200)
BillOverFlow

RWendi - o agrupamento padrão do SQL Server não faz distinção entre maiúsculas e minúsculas, o que se aplica ao nível do banco de dados. Mais informações aqui stackoverflow.com/questions/1439485/…
jwoe

57

Você quer uma restrição de verificação .

As restrições CHECK determinam os valores válidos de uma expressão lógica que não é baseada nos dados de outra coluna. Por exemplo, o intervalo de valores para uma coluna de salário pode ser limitado criando uma restrição CHECK que permite apenas dados que variam de $ 15.000 a $ 100.000. Isso evita que os salários sejam inseridos além da faixa salarial normal.

Você quer algo como:

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

Você também pode implementar restrições de verificação com funções escalares, conforme descrito no link acima, que é como eu prefiro fazer isso.


1
essa resposta também foi boa .. por que não podemos aceitar mais de uma !! :)
Adam

1
Sim, este é melhor :), +1 para isso
Owais Qureshi

11

Pessoalmente, eu o codificaria como tinyint e:

  • Ou: mude para texto no cliente, verifique a restrição entre 1 e 4
  • Ou: use uma tabela de pesquisa com uma chave estrangeira

Razões:

  • Levará em média 8 bytes para armazenar texto, 1 byte para tinyint. Em milhões de linhas, isso fará a diferença.

  • E quanto ao agrupamento? "Diário" é o mesmo que "DIÁRIO"? É preciso recursos para fazer esse tipo de comparação.

  • Por fim, e se você quiser adicionar "Quinzenal" ou "Por hora"? Isso requer uma mudança de esquema quando você poderia simplesmente adicionar novas linhas a uma tabela de pesquisa.


5

Quando você estiver editando uma tabela,
clique com o botão direito -> Verificar restrições -> Adicionar -> Digite algo como Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')no campo de expressão e um bom nome de restrição no campo (Nome).
Você terminou.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.