我正在创建一个数据库表,我没有给它分配一个逻辑主键。每个表都应该有一个主键吗?


当前回答

Will you ever need to join this table to other tables? Do you need a way to uniquely identify a record? If the answer is yes, you need a primary key. Assume your data is something like a customer table that has the names of the people who are customers. There may be no natural key because you need the addresses, emails, phone numbers, etc. to determine if this Sally Smith is different from that Sally Smith and you will be storing that information in related tables as the person can have mulitple phones, addesses, emails, etc. Suppose Sally Smith marries John Jones and becomes Sally Jones. If you don't have an artifical key onthe table, when you update the name, you just changed 7 Sally Smiths to Sally Jones even though only one of them got married and changed her name. And of course in this case withouth an artificial key how do you know which Sally Smith lives in Chicago and which one lives in LA?

你说你没有自然的密钥,因此你也没有任何字段的组合来使其唯一,这使得人工密钥至关重要。

我发现,在没有天然密钥的情况下,人工密钥对于维护数据完整性是绝对必要的。如果您确实有一个自然键,您可以使用它作为键字段。但就我个人而言,除非自然键是一个字段,否则我仍然喜欢人工键和自然键上的唯一索引。如果你不放进去,你以后会后悔的。

其他回答

不同意建议的答案。简短的回答是:不。

主键的作用是唯一地标识表上的一行,以便与另一个表形成关系。传统上,用于此目的的是一个自动递增的整数值,但也有一些变化。

但在某些情况下,例如记录时间序列数据,根本不需要这样的键,只需要占用内存。使一行唯一很简单……不需要!

举个小例子: 表A: LogData

Columns:  DateAndTime, UserId, AttribA, AttribB, AttribC etc...

不需要主键。

表B:用户

Columns: Id, FirstName, LastName etc. 

用来作为LogData表的“外键”的主键(Id)。

只要添加就可以了,以后你会后悔没有(选择,删除)。连接等)

简单的回答是:是的。

长一点的回答:

你需要你的桌子可以连接到一些东西上 如果您希望您的表被集群,您需要某种类型的主键。 如果您的表设计不需要主键,请重新考虑您的设计:很可能您遗漏了一些东西。为什么要保留相同的记录?

在MySQL中,如果你没有显式地指定主键,InnoDB存储引擎总是会创建一个主键,从而产生一个你无法访问的额外列。

注意,主键可以是复合键。

如果您有一个多对多链接表,您可以在链接中涉及的所有字段上创建主键。因此,您可以确保没有两条或更多的记录描述一个链接。

除了逻辑一致性问题之外,大多数RDBMS引擎都将受益于将这些字段包含在唯一的索引中。

由于任何主键都涉及创建唯一的索引,因此应该声明它并获得逻辑一致性和性能。

请参阅我博客中的这篇文章,了解为什么应该总是在唯一的数据上创建唯一的索引:

使索引唯一

附注:在一些非常非常特殊的情况下,您不需要主键。

大多数情况下,它们包含的日志表由于性能原因没有任何索引。

Will you ever need to join this table to other tables? Do you need a way to uniquely identify a record? If the answer is yes, you need a primary key. Assume your data is something like a customer table that has the names of the people who are customers. There may be no natural key because you need the addresses, emails, phone numbers, etc. to determine if this Sally Smith is different from that Sally Smith and you will be storing that information in related tables as the person can have mulitple phones, addesses, emails, etc. Suppose Sally Smith marries John Jones and becomes Sally Jones. If you don't have an artifical key onthe table, when you update the name, you just changed 7 Sally Smiths to Sally Jones even though only one of them got married and changed her name. And of course in this case withouth an artificial key how do you know which Sally Smith lives in Chicago and which one lives in LA?

你说你没有自然的密钥,因此你也没有任何字段的组合来使其唯一,这使得人工密钥至关重要。

我发现,在没有天然密钥的情况下,人工密钥对于维护数据完整性是绝对必要的。如果您确实有一个自然键,您可以使用它作为键字段。但就我个人而言,除非自然键是一个字段,否则我仍然喜欢人工键和自然键上的唯一索引。如果你不放进去,你以后会后悔的。

最好有一个主键。通过这种方式,它满足了第一种标准形式,并允许您继续沿着数据库规范化路径进行。

正如其他人所述,有一些理由不使用主键,但如果有主键,大多数情况下不会受到损害