首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绕过需要非空列的主键

绕过需要非空列的主键
EN

Database Administration用户
提问于 2018-09-06 13:46:25
回答 1查看 2K关注 0票数 1

词问题

我需要能够创建一个表,该表的列是外键,可以为空,但也是(复合)主键的一部分。显然,问题是(至少在Server 2014中)我不能在主键中有一个可空列。

示例

代码语言:javascript
运行
复制
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‘上定义主键约束.

我的解决办法:

代码语言:javascript
运行
复制
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)
)

但这感觉很脏。这是我唯一的选择吗?

EN

回答 1

Database Administration用户

发布于 2018-09-06 13:50:53

主键和唯一的聚集索引之间没有物理区别。因此,除非您正在使用某些需要主键的工具,否则您可以这样做

代码语言:javascript
运行
复制
CREATE TABLE Test2
(
    TestId1 INT NOT NULL,
    TestId2 INT NULL,
    UNIQUE CLUSTERED (TestId1, TestId2),
    FOREIGN KEY (TestId1, TestId2) REFERENCES Test (Id1, Id2)
)
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/216915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档