sql >> Databáze >  >> RDS >> Sqlserver

Přidejte omezení SQL XOR mezi dva FK s možnou hodnotou null

Jedním ze způsobů, jak toho dosáhnout, je jednoduše napsat, co „exkluzivní NEBO“ ve skutečnosti znamená:

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

Pokud však máte mnoho FK, výše uvedená metoda se může rychle stát nepraktickou, v takovém případě můžete udělat něco takového:

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, tento vzor má legitimní použití, například toto (i když se nevztahuje na MS SQL Server kvůli nedostatku odložených omezení). Zda je to ve vašem konkrétním případě legitimní, nemohu na základě vámi dosud poskytnutých informací posoudit.



  1. Aktualizovat část DateTime v SQL

  2. Chyba instalace při pokusu o instalaci aplikace gis pomocí geodjango?

  3. Neplatný měsíc na příkazu INSERT

  4. Aktualizace řádku pomocí poddotazu vracejícího více řádků