これを実現する 1 つの方法は、「排他的 OR」が実際に何を意味するかを簡単に書き留めることです。
CHECK (
(FK1 IS NOT NULL AND FK2 IS NULL)
OR (FK1 IS NULL AND FK2 IS NOT NULL)
)
ただし、多くの FK がある場合、上記の方法はすぐに扱いにくくなる可能性があります。その場合は、次のようにすることができます。
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)
...
)
)
ところで、そのパターンには正当な用途があります。 -ones/9178524#9178524">これ (ただし、遅延制約がないため、MS SQL Server には適用できません)。あなたの特定のケースでそれが正当であるかどうかは、あなたがこれまでに提供した情報に基づいて判断することはできません.