唯一索引上的外键不适用于NULL列

我在SQL Server中的一个唯一索引上挣扎着一个外键,这不像预期的那样工作。

我的表结构是这样的:

  • 表mm1在代理键列ID上具有非聚集PK索引
  • 此外,mm1在三列上有一个聚类唯一索引(其中一个可为空)
  • 表mm2通过外键在这三列上链接
  • 这些对象的创建不会引发任何错误。 但是,外键没有正确评估,并且允许在mm2中插入mm1中不存在的值。 这似乎与可空列c ...有关。如果我只在列a和b上设置外键,它按预期工作。

    你能解释这种行为吗? 为什么允许首先定义一个包含null的唯一索引,但在外键约束中不能正确支持它? 有没有办法在不改变表格mm2的内容的情况下获得正确的结果?

    这里有一个小的repro脚本:

    CREATE table mm1 (
        id int identity(1,1) NOT NULL,
        a varchar(50) not null,     
        b int not null, 
        c int null, 
        PRIMARY KEY NONCLUSTERED(id))
    
    CREATE table mm2 (
        id int identity(1,1) NOT NULL,
        a varchar(50) not null,
        b int not null,
        c int null,
        d varchar(10),
        PRIMARY KEY NONCLUSTERED(id))
    
    CREATE  UNIQUE CLUSTERED INDEX  idx_mm1_mm_fkTest1 ON mm1(a,b,c)
    
    ALTER TABLE mm2
    ADD CONSTRAINT  fk_mm2_mm_fkTest1 
    FOREIGN KEY (a,b, c)  REFERENCES mm1(a,b,c)
    
    ALTER TABLE mm2 CHECK CONSTRAINT fk_mm2_mm_fkTest1;
    
    INSERT INTO mm1 VALUES ('abc', 1, 2);
    
    INSERT INTO mm2 
    (a,b,d) VALUES('sa',1,'sad')
    
    SELECT * FROM mm2;
    

    我完全不知道我期望这样做。 我考虑得越多,意识就越少。

    在这些上下文中评估NULL意味着UNKNOWN。 在一个外键未知的情况下,你永远无法确定它首先引用哪一行。 换句话说,这个约束没有语义意义。

    使用默认值并让外键仅命中非空值。 如果你在外键中允许NULL,它们将会悬而未决。

    链接地址: http://www.djcxy.com/p/76311.html

    上一篇: Foreign Key on unique index doesn't work with NULL column

    下一篇: How to INSERT a field that contains an underscore and is also a foreign key