2010-03-14 17 views
76

¿Hay alguna manera de especificar, por ejemplo, 4 valores distintos para una columna varchar en MS SQL Server 2008?Restringir la columna varchar() a valores específicos?

Por ejemplo, necesito una columna llamada Frecuencia (varchar) que sólo acepta 'Daily', 'semanal', 'mensual', 'anual' como posibles valores

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

+4

Si es seguro suponer 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 varchar(). – Wikser

Respuesta

93

¿Ya ha considerado añadir un check constraint en esa columna que restringiría los valores? Algo así como:

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

Gracias, esto funcionó muy bien. Sin embargo, un pequeño cambio que tuve que hacer fue que "Frequency IN ...." tenía que estar entre paréntesis también. A SQL Server Studio no le gustó sin por alguna razón. – Adam

+1

¿Es esta comprobación de restricción sensible a mayúsculas y minúsculas? – RWendi

+3

Creo que omitió un coma después de la 4ª línea 'Frechar varchar (200)' – BillOverFlow

45

Quiere un check constraint.

restricciones CHECK determinan los valores válidos de una expresión lógica que no se basa en los datos de otra columna. Para el ejemplo , el rango de valores para una columna de salario puede estar limitado por creando una restricción CHECK que permite solo datos que van desde $ 15,000 hasta $ 100,000. Este impide que los salarios se ingresen más allá del rango de salario normal.

quieres algo así como:

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

También puede implementar restricciones de comprobación con las funciones escalares, como se describe en el enlace de arriba, que es lo que prefiero hacerlo.

+0

esta respuesta también fue buena ... ¿por qué no podemos aceptar más de una? :) – Adam

+1

Sí, este es mejor :), +1 para eso –

4

Cuando se está editando una tabla
clic derecho -> Restricciones de comprobación -> Añadir -> Tipo Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly') algo así como en el campo de expresión y un buen nombre de la restricción en el campo (Nombre).
Usted ha terminado.

11

Personalmente, me gustaría codificaré como tinyint y:

  • O bien: cambiar a texto en el cliente, restricción de comprobación entre 1 y 4
  • O: utilizar una tabla de búsqueda con una clave externa

Razones:

  • se necesitará una media de 8 bytes para almacenar texto, 1 byte para t inyint. En millones de filas, esto marcará la diferencia.

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

  • Finalmente, ¿qué sucede si quiere agregar "Cada dos semanas" o "Cada hora"? Esto requiere un cambio de esquema cuando podría simplemente agregar nuevas filas a una tabla de búsqueda.

Cuestiones relacionadas