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

Jes*_*lam 0 t-sql sql-server database-design

观察下表模型:

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

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

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

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

Mar*_*ith 5

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

添加一个的语法是

ALTER TABLE  [site].[Permissions] 
ADD CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (id,[Type])
Run Code Online (Sandbox Code Playgroud)

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

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

如果它出现在所有3列上,那么就可以解决为什么不想要主键?

如果要在表上创建聚簇索引,可以将其作为主键.如果说你在做一个聚集索引id列只SQL服务器将增加在uniqueifiers无论如何,使其独特的和你的列是如此狭窄(int,smallint,int)这似乎只是一个毫无意义的补充.

此外,查询优化器可以使用唯一约束来改进其查询计划(尽管可能不适用,如果该表上的唯一查询确实是这样WHERE [ID] = ?),并且允许重复,然后您必须同时存储和过滤掉它们将是非常浪费的DISTINCT.