Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Aggiungi un vincolo SQL XOR tra due FK nullable

Un modo per ottenerlo è semplicemente scrivere cosa significa effettivamente "OR esclusivo":

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

Tuttavia, se hai molti FK, il metodo sopra può diventare rapidamente ingombrante, nel qual caso puoi fare qualcosa del genere:

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

A proposito, ci sono usi legittimi per quel modello, ad esempio questo (sebbene non applicabile a MS SQL Server a causa della mancanza di vincoli differiti). Se è legittimo nel tuo caso particolare, non posso giudicare in base alle informazioni che hai fornito finora.