pro*_*ock 11 sql database-design sql-server-2005
我想在一个表中定义两个可空FK之间的约束,其中如果一个为空,另一个需要一个值,但两者都不能为空,两者都不能有值.逻辑是派生表从任一FK表继承数据以确定其类型.另外,对于有趣的奖励积分,这是一个坏主意吗?
Bra*_*vic 15
实现它的一种方法是简单地写下"异或"实际意味着什么:
CHECK (
(FK1 IS NOT NULL AND FK2 IS NULL)
OR (FK1 IS NULL AND FK2 IS NOT NULL)
)
Run Code Online (Sandbox Code Playgroud)
但是,如果你有很多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)
...
)
)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,该模式有合法用途,例如这一模式(尽管由于缺少延迟约束而不适用于MS SQL Server).在您的特定情况下是否合法,我无法根据您目前提供的信息进行判断.