Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Adicione uma restrição SQL XOR entre dois FKs anuláveis


Uma maneira de conseguir isso é simplesmente escrever o que "OU exclusivo" realmente significa:
CHECK (
    (FK1 IS NOT NULL AND FK2 IS NULL)
    OR (FK1 IS NULL AND FK2 IS NOT NULL)
)

No entanto, se você tiver muitos FKs, o método acima pode se tornar rapidamente complicado, caso em que você pode fazer algo assim:
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)
        ...
    )
)

Aliás, existem usos legítimos para esse padrão, por exemplo este (embora não aplicável ao MS SQL Server devido à falta de restrições diferidas). Se é legítimo no seu caso específico, não posso julgar com base nas informações que você forneceu até agora.