我正在创建数据库表,但没有为其分配逻辑主键。因此,我正在考虑不使用主键,但是对此感到内I。我是不是该?
每个表都应该有一个主键吗?
我正在创建数据库表,但没有为其分配逻辑主键。因此,我正在考虑不使用主键,但是对此感到内I。我是不是该?
每个表都应该有一个主键吗?
Answers:
简短的回答:是的。
长答案:
在MySQL中,如果您没有明确指定InnoDB存储引擎,它总是会创建一个主键,从而增加了一个您无权访问的列。
请注意,主键可以是复合键。
如果您有一个多对多链接表,则在链接所涉及的所有字段上创建主键。因此,您可以确保没有两个或多个描述一个链接的记录。
除了逻辑一致性问题外,大多数RDBMS引擎都将受益于将这些字段包含在唯一索引中。
并且由于任何主键都涉及创建唯一索引,因此您应该对其进行声明并获得逻辑一致性和性能。
有关为什么应始终对唯一数据创建唯一索引的信息,请参见我的博客中的这篇文章:
PS在某些非常非常特殊的情况下,您不需要主键。
通常,它们包括由于性能原因而没有任何索引的日志表。
除了少数几种非常罕见的情况(可能是多对多关系表,或者是您临时用于批量加载大量数据的表)之外,我会这样说:
如果没有主键,则它不是表!
渣
您是否需要将此表加入其他表?您需要一种唯一标识记录的方法吗?如果答案是肯定的,则需要一个主键。假设您的数据就像一个客户表,上面有客户的名字。可能没有自然键,因为您需要地址,电子邮件,电话号码等来确定此Sally Smith是否与Sally Smith不同,并且您将把该信息存储在相关表格中,因为此人可以使用多种电话,地址。 ,电子邮件等。假设Sally Smith与John Jones结婚并成为Sally Jones。如果您桌上没有万能钥匙,则在更新姓名时,您只是将7位Sally Smiths更改为Sally Jones,即使其中只有一位结婚并改了名字。
您说您没有自然钥匙,因此也没有任何字段组合可以唯一,这使得人为钥匙至关重要。
我发现,只要我没有自然密钥,就必须使用人工密钥来维护数据完整性。如果您有自然键,则可以将其用作键字段。但就个人而言,除非自然键是一个领域,否则我仍然更喜欢人工键和自然键上的唯一索引。如果您不投入,稍后您会后悔的。
在每张桌子上都有一个PK是一个好习惯,但这不是必须的。根据您的需要,很可能您将需要唯一索引和/或聚集索引(是否为PK)。
查阅联机丛书上的“主键和聚簇索引”部分(适用于SQL Server)
“ PRIMARY KEY约束标识具有唯一标识表中一行的值的列或列集。表中的任何两行都不能具有相同的主键值。您不能为主键中的任何列输入NULL。建议使用小的整数列作为主键。每个表都应有一个主键。符合主键值的一列或多列组合称为候选键。 ”
但同时也请查看以下内容:http : //www.aisintl.com/case/primary_and_foreign_key.html
不同意建议的答案。简短的答案是:否。
主键的目的是唯一地标识表上的一行,以便与另一个表建立关系。传统上,自动递增的整数值用于此目的,但是对此有所不同。
但是,在某些情况下,例如记录时间序列数据,根本不需要这样的键,而只占用内存。简单地使行成为唯一……不是必需的!
一个小例子:表A:LogData
Columns: DateAndTime, UserId, AttribA, AttribB, AttribC etc...
不需要主键。
表B:用户
Columns: Id, FirstName, LastName etc.
为了用作LogData表的“外键”,需要主键(Id)。
要使其成为未来的证明,您确实应该这样做。如果要复制它,则需要一个。如果您想将它加入另一张桌子,您的生活(以及明年必须维护的可怜的傻瓜的生活)将变得更加轻松。