SQL Server设计中是否必须使用“主键”?

时间:2010-08-22 01:35:25

标签: sql-server tsql database-design

观察下表模型:

CREATE TABLE [site].[Permissions] (
    [ID]     INT REFERENCES [site].[Accounts]( [ID] ) NOT NULL,
    [Type]   SMALLINT NOT NULL, 
    [Value]  INT NULL
);

site.Accounts-> site.Permissions是一对多关系,因此由于PK强加的唯一性,'ID'无法成为主键。

使用WHERE [ID] = ?子句选择行,因此添加一个虚假的IDENTITY列并使其成为PK不会带来额外磁盘空间的好处。

我的理解是目标平台 - SQL Server(2008) - 不支持复合PK。这些都加起来我的问题:如果没有使用主键,那么有什么不对吗?或者可能更正确?

1 个答案:

答案 0 :(得分:5)

您的理解不正确,SQL Server支持复合主键!

添加一个的语法是

ALTER TABLE  [site].[Permissions] 
ADD CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (id,[Type])

关于评论中的问题“将PK放在整个桌子上有什么好处?”

我不确定你的描述虽然PK需要什么。是全部3列还是只有2列?如果它在id,[Type]上,则可能您不希望相同的id,[Type]组合可能会出现多次与冲突值相关的可能性。

如果它位于所有3列上,那么为了解决您为什么不想要主键?

如果要在表上创建聚簇索引,可以将其作为主键。如果您在id列上创建聚簇索引,则只有SQL Server会添加唯一符,以使其唯一且您的列非常狭窄(intsmallint,{{1}这似乎是一个毫无意义的补充。

此外,查询优化器可以使用唯一约束来改进其查询计划(尽管可能不适用,如果该表上的唯一查询确实是int),那么允许重复项是非常浪费的。使用WHERE [ID] = ?存储和过滤掉。