这可能是一个非常幼稚和愚蠢的问题,但我还是要问
我有一个包含多个字段的表,其中没有一个是唯一的,还有一个主键,显然是。
该表通过非唯一字段定期访问,但没有用户 SP 或进程通过主键访问数据。那么主键是必需的吗?它在幕后使用吗?删除它会正面或负面地影响性能吗?
原文由 roryok 发布,翻译遵循 CC BY-SA 4.0 许可协议
这可能是一个非常幼稚和愚蠢的问题,但我还是要问
我有一个包含多个字段的表,其中没有一个是唯一的,还有一个主键,显然是。
该表通过非唯一字段定期访问,但没有用户 SP 或进程通过主键访问数据。那么主键是必需的吗?它在幕后使用吗?删除它会正面或负面地影响性能吗?
原文由 roryok 发布,翻译遵循 CC BY-SA 4.0 许可协议
在逻辑模型中,一张表必须至少有一个键。没有理由任意指定其中一个键是“主键”;所有的键都是平等的。虽然“主键”的概念可以追溯到 Ted Codd 的早期工作,但早期发现的错误早已在关系理论中得到纠正。
可悲的是, PRIMARY KEY
进入了 SQL,从那时起我们就不得不忍受它。 SQL 表可以有重复的行,如果您认为 SELECT
查询的结果集也是一个表,那么 SQL 表也可以有重复的行。关系理论家非常不喜欢 SQL。然而,仅仅因为 SQL 允许您做各种古怪的非关系性事情,这并不意味着您必须实际去做。确保每个 SQL 表至少有一个键是一种很好的做法。
在 SQL 中,单独使用 PRIMARY KEY
会产生影响,例如 NOT NULL
, UNIQUE
,表的默认外键引用。在 SQL Server 中,单独使用 PRIMARY KEY
会产生影响,例如表的聚集索引。然而,在所有这些情况下,隐式行为都可以使用特定的语法显式化。
您可以结合使用 UNIQUE
(约束而不是索引)和 NOT NULL
在 SQL 中强制执行键。因此,不,SQL Server 不需要主键(甚至 PRIMARY KEY
)。
原文由 onedaywhen 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
800 阅读
必要的?不。在幕后使用?好吧,它被保存到磁盘并保存在行缓存中,等等。删除会稍微提高你的性能(使用毫秒精度的手表来注意)。
但是……下次有人需要创建对这个表的引用时,他们会诅咒你。如果他们勇敢,他们会添加一个PK(并等待很长时间让DB创建列)。如果他们既不勇敢也不愚蠢,他们将开始使用业务密钥(即数据列)创建引用,这将导致维护噩梦。
结论:既然拥有一个PK的成本(即使它没有使用ATM)那么小,就让它吧。