唯一索引上的外键不适用于NULL列
我在SQL Server中的一个唯一索引上挣扎着一个外键,这不像预期的那样工作。
我的表结构是这样的:
这些对象的创建不会引发任何错误。 但是,外键没有正确评估,并且允许在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