【问题标题】:Are 'Primary Keys' obligatory in SQL Server Design?SQL Server 设计中是否必须使用“主键”?
【发布时间】:2010-08-22 10:01:31
【问题描述】:

观察下表模型:

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。这些加起来就是我的问题:如果没有使用主键,那么有什么问题吗?或者还有什么更正确的吗?

【问题讨论】:

标签: sql-server tsql database-design


【解决方案1】:

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

加一的语法是

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

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

从您的描述中,我不确定 PK 需要打开什么。是全部 3 列还是仅 2 列?如果它在id,[Type] 上,那么您可能不希望相同的id,[Type] 组合出现多次且值冲突的可能性。

如果它在所有 3 列上,那么将问题转向你为什么不想要主键?

如果你要在你的表上有一个聚集索引,你可以把它作为主键。如果说您在 id 列上创建了一个聚集索引,那么只有 SQL Server 会添加唯一标识符以使其唯一并且您的列非常窄(intsmallintint)这似乎是一个毫无意义的添加.

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

【讨论】:

  • 好吧...很惊讶我在谷歌上找不到任何东西。无论哪种方式,将PK放在整个桌子上有什么好处? 1. 数据完整性:禁止相同的行... 2.?
  • 实体完整性。我不确定你的描述,虽然 PK 需要是什么。是全部 3 列还是仅 2 列?如果它在id,[Type] 上,那么您可能不希望相同的id,[Type] 组合出现两个不同的值。如果它在所有 3 列上,那么允许重复项将是浪费,然后您必须使用 DISTINCT 存储和过滤掉。
  • @Kivin: 2) 主键通常意味着聚集索引,它比非聚集索引要好——尤其是考虑到您将如何搜索表。聚簇键不一定是主键,但通常是主键。
  • @马丁,你是对的。当我坐下来阅读 Michael Haren 的链接并着手编写 PK 时,我意识到我只想要前两列的唯一性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多