2009-12-02 11 views
10

bromeando con un colega, se me ocurrió una situación interesante: ¿es posible en SQL Server definir una tabla para que a través de "medios estándar" (restricciones, etc.) pueda asegurarse de que dos o más columnas sean mutuamente excluyentesSQL-Server: Definir columnas como mutuamente excluyentes

Con esto quiero decir: ¿Puedo asegurarme de que solo una de las columnas contiene un valor?

+0

¿Qué problema estás tratando de resolver? las bases de datos subnormales son un PITA para trabajar, quizás puedas hacerlo de una manera que no sacrifique las golosinas relacionales. –

+0

Bueno, no hay un problema real detrás de esa idea. Solo quería saber si es técnicamente posible hacer eso. Una idea PUEDE ser el requisito de que un usuario pueda ingresar su propio nombre o el nombre de la empresa, pero no ambos. Supongo que pensando mucho podría llegar a algo mejor :-) –

Respuesta

14

Sí se puede, mediante una restricción CHECK:

ALTER TABLE YourTable 
ADD CONSTRAINT ConstraintName CHECK (col1 is null or col2 is null) 

por su comentario, si muchas columnas son exclusivos, se puede comprobar como esto:

case when col1 is null then 0 else 1 end + 
case when col2 is null then 0 else 1 end + 
case when col3 is null then 0 else 1 end + 
case when col4 is null then 0 else 1 end 
= 1 

Esto dice que una de las cuatro columnas deben contener un valor. Si todos pueden ser NULL, solo marque <= 1.

+0

Ah sí, puedo ver a dónde va esto. Sin embargo, el cheque sería mucho más complejo si tuviera tres o más columnas, ya que tendría que agregar todas las combinaciones posibles, ¿verdad? –

+0

@Thorsten Dittmar: Se vuelve un poco más complejo con varias columnas, creo que puedes hacerlo sin agregar todas las combinaciones posibles, respuesta editada – Andomar

+0

Hola coincidencias de requisitos con la misma situación exacta descrita anteriormente, pero adicionalmente quiero col1 y col2 no deberían ser nulo al mismo tiempo, solo que cualquiera de ellos debe estar siempre poblado ... ¿Cómo asegurar eso? – MaxRecursion

Cuestiones relacionadas