sql >> Database >  >> RDS >> Sqlserver

Voeg een SQL XOR-beperking toe tussen twee nullable FK's

Een manier om dit te bereiken is door simpelweg op te schrijven wat "exclusieve OR" eigenlijk betekent:

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

Als je echter veel FK's hebt, kan de bovenstaande methode snel onpraktisch worden, in welk geval je zoiets als dit kunt doen:

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, er zijn legitieme toepassingen voor dat patroon, bijvoorbeeld deze (hoewel niet van toepassing op MS SQL Server vanwege het ontbreken van uitgestelde beperkingen). Of het in uw specifieke geval legitiem is, kan ik niet beoordelen op basis van de informatie die u tot nu toe heeft verstrekt.



  1. Met een mySQL-fout, onbekende kolom waar clausule

  2. Vergrendelen voor SELECT zodat een ander proces geen oude gegevens krijgt

  3. Float of decimaal gebruiken voor het dollarbedrag van de boekhoudtoepassing?

  4. VOEG een reëel getal in een kolom in op basis van andere kolommen OUDE INSERT's