Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fügen Sie eine SQL-XOR-Einschränkung zwischen zwei Nullable-FKs hinzu

Eine Möglichkeit, dies zu erreichen, besteht darin, einfach aufzuschreiben, was "exklusives ODER" eigentlich bedeutet:

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

Wenn Sie jedoch viele FKs haben, kann die obige Methode schnell unhandlich werden, in diesem Fall können Sie Folgendes tun:

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

Übrigens gibt es legitime Anwendungen für dieses Muster, zum Beispiel dieses hier (allerdings aufgrund des Fehlens verzögerter Einschränkungen nicht auf MS SQL Server anwendbar). Ob es in Ihrem speziellen Fall legitim ist, kann ich anhand Ihrer bisherigen Informationen nicht beurteilen.