sql >> Databasteknik >  >> RDS >> Sqlserver

Lägg till en SQL XOR-begränsning mellan två nullbara FK:er

Ett sätt att uppnå det är att helt enkelt skriva ner vad "exklusivt ELLER" faktiskt betyder:

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

Men om du har många FK:er kan ovanstående metod snabbt bli svårhanterlig, i så fall kan du göra något så här:

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, det finns legitima användningsområden för det mönstret, till exempel denna (även om det inte är tillämpligt på MS SQL Server på grund av bristen på uppskjutna begränsningar). Huruvida det är legitimt i just ditt fall kan jag inte bedöma baserat på den information du har lämnat hittills.



  1. MySQL kombinera två kolumner och lägg till en ny kolumn

  2. Finns det någon MySQL Aggregate-funktion för CONTAINS?

  3. Upptäcker om OLD-värdet inte är lika med NEW-värdet och OLD-värdet var NULL

  4. Oracle sql-typer över dblink