我想在一个表,如果是空的其他需要一个值来定义之间有两个可空FK的约束,但两者不能为空,既不能有值。 逻辑是派生表从任一FK表的继承数据,以确定其类型。 此外,为乐趣加分,这是一个坏主意?
Answer 1:
实现这一目标的方法之一是简单地写下“异或”实际上是指:
CHECK (
(FK1 IS NOT NULL AND FK2 IS NULL)
OR (FK1 IS NULL AND FK2 IS NOT NULL)
)
但是,如果你有很多FKS,上述方法可以迅速变得难以处理,在这种情况下,你可以这样做:
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)
...
)
)
顺便说一句,就表示该模式合法用途,例如这一个 (虽然不是适用于MS SQL Server,由于缺乏延迟约束)。 无论是在您的特定情况下合法的,我无法判断基于您目前提供的信息。
Answer 2:
您可以使用检查约束 :
create table #t (
a int,
b int);
alter table #t add constraint c1
check ( coalesce(a, b) is not null and a*b is null );
insert into #t values ( 1,null);
insert into #t values ( null ,null);
运行:
The INSERT statement conflicted with the CHECK constraint "c1".
Answer 3:
另一种方法是在一个过程来定义这个检查约束。 之前插入派生表中的记录,约束应该感到满意。 否则插入失败或返回一个错误。
文章来源: Add a SQL XOR Constraint between two nullable FK's