我正在创建一个数据库表,我没有给它分配一个逻辑主键。每个表都应该有一个主键吗?
当前回答
我总是有一个主键,即使一开始我还没有想到它的目的。有几次,当我最终需要在一个没有PK的表中输入PK时,总是会遇到更多的麻烦。我认为总是有一个人会有更多的好处。
其他回答
为了证明未来,你真的应该这么做。如果你想复制它,你需要一个。如果你想把它加入到另一张桌子上,你的生活(以及那些明年不得不维持它的可怜的傻瓜们的生活)将会轻松得多。
简单的回答是:是的。
长一点的回答:
你需要你的桌子可以连接到一些东西上 如果您希望您的表被集群,您需要某种类型的主键。 如果您的表设计不需要主键,请重新考虑您的设计:很可能您遗漏了一些东西。为什么要保留相同的记录?
在MySQL中,如果你没有显式地指定主键,InnoDB存储引擎总是会创建一个主键,从而产生一个你无法访问的额外列。
注意,主键可以是复合键。
如果您有一个多对多链接表,您可以在链接中涉及的所有字段上创建主键。因此,您可以确保没有两条或更多的记录描述一个链接。
除了逻辑一致性问题之外,大多数RDBMS引擎都将受益于将这些字段包含在唯一的索引中。
由于任何主键都涉及创建唯一的索引,因此应该声明它并获得逻辑一致性和性能。
请参阅我博客中的这篇文章,了解为什么应该总是在唯一的数据上创建唯一的索引:
使索引唯一
附注:在一些非常非常特殊的情况下,您不需要主键。
大多数情况下,它们包含的日志表由于性能原因没有任何索引。
我的职责是维护海外开发团队创建的应用程序。现在我在应用程序中有各种各样的问题,因为原始的数据库模式不包含一些表上的主键。所以请不要让别人因为你糟糕的设计而受苦。在表上设置主键总是一个好主意。
如果你正在使用Hibernate,不可能创建一个没有主键的实体。如果您正在使用使用普通sql/ddl脚本创建的现有数据库,并且没有添加主键,则此问题可能会产生问题
除了少数非常罕见的情况(可能是多对多关系表,或者临时用于批量加载大量数据的表),我会使用以下说法:
如果它没有主键,它就不是表!
Marc
推荐文章
- 获得PostgreSQL数据库中当前连接数的正确查询
- MySQL数据库表中的最大记录数
- 从现有模式生成表关系图(SQL Server)
- HyperLogLog算法是如何工作的?
- 数据库和模式的区别
- 如何从命令行在windows中找到mysql数据目录
- 货币应该使用哪种数据类型?
- 如何找到MySQL的根密码
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 什么是分片,为什么它很重要?
- 数据库触发器是必要的吗?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?