¿Restringir la columna varchar () a valores específicos?

94

¿Hay alguna manera de especificar, por ejemplo, 4 valores distintos para una columna varchar en MS SQL Server 2008?

Por ejemplo, necesito una columna llamada Frecuencia (varchar) que solo acepte 'Diariamente', 'Semanal', 'Mensual', 'Anual' como valores posibles

¿Es posible establecer esto dentro de SQL Server Management Studio al crear la tabla?

Adán
fuente
5
Si es seguro asumir que no habrá más valores válidos y habrá muchas filas en la tabla, codificaría los valores posibles en algo más pequeño y más rápido que un varchar ().
Wikser

Respuestas:

128

¿Ya consideró agregar un check constrainten esa columna que restringiría los valores? Algo como:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)
Ashish Gupta
fuente
2
Gracias, esto funcionó muy bien. Sin embargo, un pequeño cambio que tuve que hacer fue que "Frecuencia EN ..." también tenía que estar entre paréntesis. SQL Server Studio no le gustó sin por alguna razón.
Adam
1
¿Esta verificación de restricciones distingue entre mayúsculas y minúsculas?
RWendi
3
Creo que te perdiste un coma después de la cuarta líneaFrequency varchar(200)
BillOverFlow
RWendi: la intercalación predeterminada de SQL Server no distingue entre mayúsculas y minúsculas, lo que se aplica al nivel de la base de datos. Más información aquí stackoverflow.com/questions/1439485/…
jwoe
57

Quieres una restricción de verificación .

Las restricciones CHECK determinan los valores válidos de una expresión lógica que no se basa en datos de otra columna. Por ejemplo, el rango de valores para una columna de salario se puede limitar creando una restricción CHECK que solo permita datos que oscilen entre $ 15,000 y $ 100,000. Esto evita que se ingresen salarios más allá del rango de salario regular.

Quieres algo como:

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

También puede implementar restricciones de verificación con funciones escalares, como se describe en el enlace anterior, que es como prefiero hacerlo.

Michael Petrotta
fuente
1
esta respuesta también fue buena ... ¿por qué no podemos aceptar más de uno? :)
Adam
1
Sí, este es mejor :), +1 para eso
Owais Qureshi
11

Personalmente, lo codificaría como tinyint y:

  • O bien: cámbielo a texto en el cliente, verifique la restricción entre 1 y 4
  • O: use una tabla de búsqueda con una clave externa

Razones:

  • Se necesitarán en promedio 8 bytes para almacenar texto, 1 byte para tinyint. En millones de filas, esto marcará la diferencia.

  • ¿Qué pasa con la colación? ¿Es "Diario" lo mismo que "DIARIO"? Se necesitan recursos para hacer este tipo de comparación.

  • Por último, ¿qué sucede si desea agregar "Quincenal" o "Cada hora"? Esto requiere un cambio de esquema cuando puede agregar nuevas filas a una tabla de búsqueda.

gbn
fuente
5

Cuando esté editando una tabla,
haga clic con el botón derecho -> Comprobar restricciones -> Agregar -> Escriba algo como Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')en el campo de expresión y un buen nombre de restricción en el campo (Nombre).
Estás listo.

Denis K
fuente