观察下表模型:
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。这些都加起来我的问题:如果没有使用主键,那么有什么不对吗?或者可能更正确?
答案 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会添加唯一符,以使其唯一且您的列非常狭窄(int
,smallint
,{{1}这似乎是一个毫无意义的补充。
此外,查询优化器可以使用唯一约束来改进其查询计划(尽管可能不适用,如果该表上的唯一查询确实是int
),那么允许重复项是非常浪费的。使用WHERE [ID] = ?
存储和过滤掉。