sql >> Base de Datos >  >> RDS >> Sqlserver

Agregue una restricción SQL XOR entre dos FK anulables

Una forma de lograrlo es simplemente escribir lo que realmente significa "OR exclusivo":

CHECK (
    (FK1 IS NOT NULL AND FK2 IS NULL)
    OR (FK1 IS NULL AND FK2 IS NOT NULL)
)

Sin embargo, si tiene muchos FK, el método anterior puede volverse difícil de manejar rápidamente, en cuyo caso puede hacer algo como esto:

CHECK (
    1 = (
        (CASE WHEN FK1 IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN FK2 IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN FK3 IS NULL THEN 0 ELSE 1 END)
        + (CASE WHEN FK4 IS NULL THEN 0 ELSE 1 END)
        ...
    )
)

Por cierto, hay usos legítimos para ese patrón, por ejemplo este (aunque no aplicable a MS SQL Server debido a la falta de restricciones diferidas). Si es legítimo en su caso particular, no puedo juzgar en base a la información que proporcionó hasta ahora.