我需要能够创建一个表,该表的列是外键,可以为空,但也是(复合)主键的一部分。显然,问题是(至少在Server 2014中)我不能在主键中有一个可空列。
CREATE TABLE Test
(
Id1 INT NOT NULL,
Id2 INT NOT NULL,
PRIMARY KEY (Id1, Id2)
)
CREATE TABLE Test2
(
TestId1 INT NOT NULL,
TestId2 INT NULL,
PRIMARY KEY (TestId1, TestId2),
FOREIGN KEY (TestId1, TestId2) REFERENCES Test (Id1, Id2)
)错误出现在Test2的主键上:
不能在表或用户定义的表类型中的可空列'TestId2‘上定义主键约束.
我的解决办法:
CREATE TABLE Test3
(
TestId1 INT NOT NULL,
TestId2Calc AS COALESCE(TestId2, -1) PERSISTED NOT NULL,
TestId2 INT NULL,
PRIMARY KEY (TestId1, TestId2Calc),
FOREIGN KEY (TestId1, TestId2) REFERENCES Test (Id1, Id2)
)但这感觉很脏。这是我唯一的选择吗?
发布于 2018-09-06 13:50:53
主键和唯一的聚集索引之间没有物理区别。因此,除非您正在使用某些需要主键的工具,否则您可以这样做
CREATE TABLE Test2
(
TestId1 INT NOT NULL,
TestId2 INT NULL,
UNIQUE CLUSTERED (TestId1, TestId2),
FOREIGN KEY (TestId1, TestId2) REFERENCES Test (Id1, Id2)
)https://dba.stackexchange.com/questions/216915
复制相似问题