SQL Server 中是否需要主键?

新手上路,请多包涵

这可能是一个非常幼稚和愚蠢的问题,但我还是要问

我有一个包含多个字段的表,其中没有一个是唯一的,还有一个主键,显然是。

该表通过非唯一字段定期访问,但没有用户 SP 或进程通过主键访问数据。那么主键是必需的吗?它在幕后使用吗?删除它会正面或负面地影响性能吗?

原文由 roryok 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

必要的?不。在幕后使用?好吧,它被保存到磁盘并保存在行缓存中,等等。删除会稍微提高你的性能(使用毫秒精度的手表来注意)。

但是……下次有人需要创建对这个表的引用时,他们会诅咒你。如果他们勇敢,他们会添加一个PK(并等待很长时间让DB创建列)。如果他们既不勇敢也不愚蠢,他们将开始使用业务密钥(即数据列)创建引用,这将导致维护噩梦。

结论:既然拥有一个PK的成本(即使它没有使用ATM)那么小,就让它吧。

原文由 Aaron Digulla 发布,翻译遵循 CC BY-SA 2.5 许可协议

在逻辑模型中,一张表必须至少有一个键。没有理由任意指定其中一个键是“主键”;所有的键都是平等的。虽然“主键”的概念可以追溯到 Ted Codd 的早期工作,但早期发现的错误早已在关系理论中得到纠正。

可悲的是, PRIMARY KEY 进入了 SQL,从那时起我们就不得不忍受它。 SQL 表可以有重复的行,如果您认为 SELECT 查询的结果集也是一个表,那么 SQL 表也可以有重复的行。关系理论家非常不喜欢 SQL。然而,仅仅因为 SQL 允许您做各种古怪的非关系性事情,这并不意味着您必须实际去做。确保每个 SQL 表至少有一个键是一种很好的做法。

在 SQL 中,单独使用 PRIMARY KEY 会产生影响,例如 NOT NULLUNIQUE ,表的默认外键引用。在 SQL Server 中,单独使用 PRIMARY KEY 会产生影响,例如表的聚集索引。然而,在所有这些情况下,隐式行为都可以使用特定的语法显式化。

您可以结合使用 UNIQUE (约束而不是索引)和 NOT NULL 在 SQL 中强制执行键。因此,不,SQL Server 不需要主键(甚至 PRIMARY KEY )。

原文由 onedaywhen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进