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


当前回答

我想找到一些官方的东西像这样- 15.6.2.1集群和次要索引- MySQL。

如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB内部会在一个包含行ID值的合成列上生成一个名为GEN_CLUST_INDEX的隐藏聚集索引。行是根据InnoDB分配给这样一个表中的行的ID来排序的。行ID是一个6字节的字段,随着新行插入而单调增加。因此,按行ID排序的行在物理上按插入顺序排列。

为什么不自己创建主键呢?此外,ORM不能识别这个隐藏的ID,这意味着您不能在代码中使用ID。

其他回答

在每个表上都有一个PK是一个很好的实践,但这不是必须的。大多数情况下,您需要一个唯一的索引,和/或聚集索引(这是PK与否),这取决于您的需要。

查看联机图书的主键和聚集索引部分(适用于SQL Server)

"PRIMARY KEY约束标识具有唯一标识表中一行的值的列或列集。表中的任何两行都不能有相同的主键值。不能为主键中的任何列输入NULL。我们建议使用一个小的整数列作为主键。每个表都应该有一个主键。符合主键值条件的列或列的组合称为候选键。”

再看看这个:http://www.aisintl.com/case/primary_and_foreign_key.html

几乎每次我创建一个没有主键的表时,我都认为我不需要主键,最终我会返回并添加一个主键。现在,我甚至用一个自动生成的标识字段作为主键来创建连接表。

为了证明未来,你真的应该这么做。如果你想复制它,你需要一个。如果你想把它加入到另一张桌子上,你的生活(以及那些明年不得不维持它的可怜的傻瓜们的生活)将会轻松得多。

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

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

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