我正在创建一个数据库表,我没有给它分配一个逻辑主键。每个表都应该有一个主键吗?
当前回答
几乎每次我创建一个没有主键的表时,我都认为我不需要主键,最终我会返回并添加一个主键。现在,我甚至用一个自动生成的标识字段作为主键来创建连接表。
其他回答
我总是有一个主键,即使一开始我还没有想到它的目的。有几次,当我最终需要在一个没有PK的表中输入PK时,总是会遇到更多的麻烦。我认为总是有一个人会有更多的好处。
在每个表上都有一个PK是一个很好的实践,但这不是必须的。大多数情况下,您需要一个唯一的索引,和/或聚集索引(这是PK与否),这取决于您的需要。
查看联机图书的主键和聚集索引部分(适用于SQL Server)
"PRIMARY KEY约束标识具有唯一标识表中一行的值的列或列集。表中的任何两行都不能有相同的主键值。不能为主键中的任何列输入NULL。我们建议使用一个小的整数列作为主键。每个表都应该有一个主键。符合主键值条件的列或列的组合称为候选键。”
再看看这个:http://www.aisintl.com/case/primary_and_foreign_key.html
如果你正在使用Hibernate,不可能创建一个没有主键的实体。如果您正在使用使用普通sql/ddl脚本创建的现有数据库,并且没有添加主键,则此问题可能会产生问题
我想找到一些官方的东西像这样- 15.6.2.1集群和次要索引- MySQL。
如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB内部会在一个包含行ID值的合成列上生成一个名为GEN_CLUST_INDEX的隐藏聚集索引。行是根据InnoDB分配给这样一个表中的行的ID来排序的。行ID是一个6字节的字段,随着新行插入而单调增加。因此,按行ID排序的行在物理上按插入顺序排列。
为什么不自己创建主键呢?此外,ORM不能识别这个隐藏的ID,这意味着您不能在代码中使用ID。
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?
你说你没有自然的密钥,因此你也没有任何字段的组合来使其唯一,这使得人工密钥至关重要。
我发现,在没有天然密钥的情况下,人工密钥对于维护数据完整性是绝对必要的。如果您确实有一个自然键,您可以使用它作为键字段。但就我个人而言,除非自然键是一个字段,否则我仍然喜欢人工键和自然键上的唯一索引。如果你不放进去,你以后会后悔的。
推荐文章
- 获得PostgreSQL数据库中当前连接数的正确查询
- MySQL数据库表中的最大记录数
- 从现有模式生成表关系图(SQL Server)
- HyperLogLog算法是如何工作的?
- 数据库和模式的区别
- 如何从命令行在windows中找到mysql数据目录
- 货币应该使用哪种数据类型?
- 如何找到MySQL的根密码
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 什么是分片,为什么它很重要?
- 数据库触发器是必要的吗?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?