添加SQL XOR约束之间的两个可空FK的(Add a SQL XOR Constraint bet

2019-06-25 15:04发布

我想在一个表,如果是空的其他需要一个值来定义之间有两个可空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