我正在创建一个数据库表,我没有给它分配一个逻辑主键。每个表都应该有一个主键吗?
当前回答
不同意建议的答案。简短的回答是:不。
主键的作用是唯一地标识表上的一行,以便与另一个表形成关系。传统上,用于此目的的是一个自动递增的整数值,但也有一些变化。
但在某些情况下,例如记录时间序列数据,根本不需要这样的键,只需要占用内存。使一行唯一很简单……不需要!
举个小例子: 表A: LogData
Columns: DateAndTime, UserId, AttribA, AttribB, AttribC etc...
不需要主键。
表B:用户
Columns: Id, FirstName, LastName etc.
用来作为LogData表的“外键”的主键(Id)。
其他回答
我总是有一个主键,即使一开始我还没有想到它的目的。有几次,当我最终需要在一个没有PK的表中输入PK时,总是会遇到更多的麻烦。我认为总是有一个人会有更多的好处。
简单的回答是:是的。
长一点的回答:
你需要你的桌子可以连接到一些东西上 如果您希望您的表被集群,您需要某种类型的主键。 如果您的表设计不需要主键,请重新考虑您的设计:很可能您遗漏了一些东西。为什么要保留相同的记录?
在MySQL中,如果你没有显式地指定主键,InnoDB存储引擎总是会创建一个主键,从而产生一个你无法访问的额外列。
注意,主键可以是复合键。
如果您有一个多对多链接表,您可以在链接中涉及的所有字段上创建主键。因此,您可以确保没有两条或更多的记录描述一个链接。
除了逻辑一致性问题之外,大多数RDBMS引擎都将受益于将这些字段包含在唯一的索引中。
由于任何主键都涉及创建唯一的索引,因此应该声明它并获得逻辑一致性和性能。
请参阅我博客中的这篇文章,了解为什么应该总是在唯一的数据上创建唯一的索引:
使索引唯一
附注:在一些非常非常特殊的情况下,您不需要主键。
大多数情况下,它们包含的日志表由于性能原因没有任何索引。
为了证明未来,你真的应该这么做。如果你想复制它,你需要一个。如果你想把它加入到另一张桌子上,你的生活(以及那些明年不得不维持它的可怜的傻瓜们的生活)将会轻松得多。
最好有一个主键。通过这种方式,它满足了第一种标准形式,并允许您继续沿着数据库规范化路径进行。
正如其他人所述,有一些理由不使用主键,但如果有主键,大多数情况下不会受到损害
我知道为了在。net中使用gridview的某些特性,你需要一个主键,以便gridview知道哪一行需要更新/删除。一般的做法应该是有一个主键或主键集群。我个人更倾向于前者。
推荐文章
- 如何检查表上持有哪些锁
- 在MongoDB中查找重复的记录
- 对于PostgreSQL表来说,多大才算太大?
- 模式、表和数据库之间的区别是什么?
- 我看到VARCHAR(255)如此频繁地使用(而不是其他长度),有什么好的原因吗?
- 使用pgadmin连接到heroku数据库
- Delete_all vs destroy_all
- 我如何移动一个redis数据库从一个服务器到另一个?
- 如何首次配置postgresql ?
- 数据库性能调优有哪些资源?
- 如何在PostgreSQL中自动更新时间戳
- 当使用JDBC连接到postgres时,是否可以指定模式?
- 删除MySQL中的主键
- 对象'DF__*'依赖于列'*' -将int改为double
- 将映像存储在MongoDB数据库中