每张桌子都应该有一个主键?

我正在创build一个数据库表,我没有分配给它的逻辑主键。 所以,我正在考虑把它放在没有主键的地方,但是我对此感到有些愧疚。 我是不是该?

每张桌子都应该有一个主键?


编辑:好的,好的…我已经创build了主键! 你现在高兴了? 🙂

简短的回答: 是的

很长的回答:

  • 你需要你的桌子可以连接的东西
  • 如果你想要你的表进行群集,你需要某种主键。
  • 如果您的桌子devise不需要主键,请重新考虑您的devise:最有可能的是,您错过了一些东西。 为什么保持相同的logging

在MySQL中,InnoDB存储引擎总是创build一个主键,如果你没有明确指定它的话,那么你将无法访问额外的列。

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

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

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

由于任何主键都涉及到创build唯一索引,所以您应该声明它并获得逻辑一致性和性能。

在我的博客中看到这篇文章,为什么你应该总是创build唯一的数据索引:

  • 制作一个索引独特

PS有一些非常非常特殊的情况,你不需要主键。

大多数情况下,他们包括日志表,没有任何性能方面的指标。

总是最好有一个主键。 这样它就符合第一种正常forms,并允许你沿着数据库规范化path继续。

正如其他人所说,有一些原因没有主键,但是如果有主键,大多数不会受到伤害

几乎任何时候,我已经创build了一个没有主键的表,认为我不会需要一个,我已经结束了回去,并添加一个。 我现在甚至创build我的连接表与我用作主键的自动生成的标识字段。

除了一些非常罕见的情况(可能是多对多的关系表,或者临时用来批量加载大量数据的表格)之外,我会说:

如果它没有主键,那不是一张桌子!

渣子

只要添加它,你会后悔当你没有(select,删除。链接等)

你会不会需要join这个表到其他表? 你需要一种唯一识别logging的方法吗? 如果答案是肯定的,你需要一个主键。 假设你的数据就像一个顾客名单中的顾客。 可能没有天然的关键,因为你需要地址,电子邮件,电话号码等来确定这个Sally Smith是否与Sally Smith不同,并且你将把这个信息存储在相关表格中,因为这个人可以有多个电话,addesses ,电子邮件等。假设萨莉史密斯结婚约翰琼斯成为莎莉琼斯。 如果你在桌子上没有人造的钥匙,当你更新名字时,你只要把萨莉·史密斯(Sally Smiths)换成萨莉·琼斯(Sally Jones),即使他们中只有一个结婚了,并且改了名字。 当然,在这种情况下,如果没有人造钥匙,你怎么知道萨利·史密斯住在芝加哥,哪个住在洛杉矶?

你说你没有自然的钥匙,所以你也没有任何独特的领域的组合,这使得关键的关键。

我发现任何时候我没有一个自然的钥匙,人造钥匙是维护数据完整性的绝对必要条件。 如果你有一个自然的键,你可以使用它作为关键字段。 但是,除非自然的关键是一个领域,否则我个人更喜欢自然的关键和唯一的索引。 如果你没有放进去,你会后悔的。

在每张桌子上都有一个PK是个好习惯,但这不是必须的。 很可能你需要一个唯一的索引,和/或一个聚集索引(这是PK或不),这取决于你的需要。

查看联机丛书(针对SQL Server)上的主键和聚簇索引部分

PRIMARY KEY约束标识了一列或一组列,这些列具有唯一标识表中某一行的值,表中没有两行可以具有相同的主键值,但不能为主键中的任何列inputNULL。build议使用一个小的整数列作为主键,每个表都应该有一个主键,一列或一组符合主键值的列被称为候选键。

但是请检查一下: http : //www.aisintl.com/case/primary_and_foreign_key.html

我知道为了在.NET中使用gridview的某些特性,你需要一个主键来让gridview知道哪一行需要更新/删除。 一般做法应该是有一个主键或主键集群。 我个人比较喜欢前者。

我总是有一把钥匙,即使一开始我也没有想到的目的。 有一次我最终需要一张桌子上没有PK的PK,而且以后总是会有更多的麻烦。 我认为总是包括一个更有好处。

为了使它未来certificate你真的应该。 如果你想复制它,你将需要一个。 如果你想join另一张桌子,你的生活(以及那些明年要维护它的可怜的傻瓜)将变得容易多了。

我在维护离岸开发团队所创build的应用程序。 现在我在应用程序中遇到各种问题,因为原始数据库模式在某些表中不包含PRIMARY KEYS。 所以请不要让其他人因为你糟糕的devise而受苦 在表上使用主键总是个好主意。

总之,没有。 但是,您需要记住某些客户端访问CRUD操作需要它。 为了将来打样,我倾向于总是使用主键。

如果你使用Hibernate,不可能创build一个没有主键的实体。 如果您正在使用纯sql / ddl脚本创build的现有数据库,并且没有添加主键,则此问题可能会造成问题