Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ajouter une contrainte SQL XOR entre deux FK nullables

Une façon d'y parvenir consiste simplement à écrire ce que "OU exclusif" signifie réellement :

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

Cependant, si vous avez de nombreux FK, la méthode ci-dessus peut rapidement devenir compliquée, auquel cas vous pouvez faire quelque chose comme ceci :

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)
        ...
    )
)

BTW, il existe des utilisations légitimes pour ce modèle, par exemple celui-ci (bien que non applicable à MS SQL Server en raison de l'absence de contraintes différées). Que ce soit légitime dans votre cas particulier, je ne peux pas juger sur la base des informations que vous avez fournies jusqu'à présent.