当我不需要使用主键时是否可以不使用主键?

9
如果我不需要主键,那么我是否应该在数据库中不添加主键?

16
几乎没有不需要主键的情况。基本上,如果一张表没有主键,那么它就不算是一张表,只是一堆数据而已。 - marc_s
2
这可能与您的问题无关,但我确实需要问一下:为什么您觉得不需要一个? - Frank V
你能给我们关于你正在处理的情况更多的信息吗?主键并不总是必要的,但如果我们知道你想做什么,或许我们可以给你一些更好的建议。 - TLiebe
2
你能解释一下为什么你认为不需要主键吗?我真的想不出有任何理由可以省略它。即使是一个单表数据模型,也需要一个主键来唯一标识一行。 - Paul Sasik
人们一直认为需要唯一标识一行数据,这让我感到很有趣。想象一下某种日志/计数器 - 我只需要知道发生了什么以及何时发生,精确到最近的一分钟。因此,我只需要事件ID和时间戳,这就足够了,因为我只想存储和计算事件实例。我承认这是牵强的,但并不完全离谱。 - Murph
2
我有像Murph建议的日志表。当你有可能相同但同时发生的事件(特别是在使用SMALLDATETIME时),你会用什么作为主键,以及为什么?PK对于性能来说并不是必要的(聚集索引与PK无关)如果您也不需要查找任何内容...在这种情况下,我会使用索引视图来提供聚合统计数据,但我认为没有必要定义一个PK。我确实同意,在大多数情况下,您确实需要主键,在您认为不需要主键的大多数情况下,您真的需要它。 - Aaron Bertrand
12个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
43

你确实需要一个主键,只是你还不知道而已。


7
以前我也认为不需要主键...... 现在我更明白了。 - MiseryIndex
2
+1 因为这最准确地反映了现实。我可以看到有些情况下可能不需要一个,但很少见。 - Murph
1
除非您不需要主键,并且您现在已经知道了。尽管这是一个不寻常的情况,但最好保险起见并支持使用主键。 - MarkPflug
1
我同意你的观点,但如果有人不同意我们的观点,这种争论永远无法说服他们。 - davidtbernal

13

主键是用于唯一标识表中的行的。

它是否被索引或聚集,是一个物理实现问题,并与逻辑设计无关。

为了使表具有意义,需要为其指定一个主键。


3

如果您不需要主键,则不要使用主键。通常我需要主键,所以我通常使用它们。如果您有相关的表格,您可能需要主键和外键。


2
是的,但只是在同样的意义下,如果您不打算发生事故,那么不使用安全带也没关系。也就是说,当您需要它时,这是一个为了获得巨大好处而付出的小代价,即使您认为自己不需要它,可能性也是未来会需要。不同之处在于,您需要主键的可能性比发生车祸的可能性更高。 您还应该知道,如果您没有创建主键,一些数据库系统会为您创建一个主键,因此从引擎方面来看,您并没有节省多少。

5
我不同意。我拒绝系安全带,因为这会妨碍我畅饮啤酒。但我永远不会创建没有主键的表。 - Reverend Gonzo
@Rev Gonzo,你需要的是一个更具策略性放置的啤酒杯架。来吧,现在已经是2010年了。 - JeffO

2

不会,除非你能找到一个例子:“如果table_x没有主键,这个数据库会工作得更好。”

如果不需要性能、数据完整性和标准化,可以提出永远不使用主键的论点。安全性和备份/还原功能可能不需要,但最终,你必须穿上成年人的裤子,加入数据库实现的真实世界。


1

是的,一张表格应该始终有一个主键...除非你不需要唯一标识其中的记录。(我喜欢做出绝对的陈述并立即反驳它们)

什么情况下不需要在表格中唯一标识记录呢?几乎从来没有。但我曾经为审计日志表之类的东西这样做过。数据不会被更新或删除,并且不会受到任何限制。本质上是结构化日志记录。


0
一个主键总是有助于查询性能。因此,如果您需要使用“键”作为“外键”进行查询,或者用作查找,则应创建一个外键。

1
我不明白主键如何提高性能?如果你不需要它们,就不会使用它们查找记录。因此,没有任何好处。 - brainfck
那么这个表将用于什么?大多数情况下,我们需要使用表来存储一些信息,并且您将从中查找值。 - Adriaan Stander
1
Luke101应该发布他的用例,我们会看看他是否需要一个。 - brainfck

0

我不知道。我使用过几个只有单行和单列的表格。始终只会有一个单行和单列。没有外键关系。

那我为什么要在里面放置主键呢?


你需要存储一条单独的信息吗?比如系统范围内的偏好设置?每个人都需要那个数据,但你不想为了获取那一个数据而创建一个全新的东西。 - ElGringoGrande
3
啊,但是你希望在这个表上有一个主键和一个检查约束,以将主键限制为单个值。否则,六个月后你回来时会发现其他人已经为你添加了另一行,而你的应用程序选择哪一行是任意的... - Damien_The_Unbeliever

0
主键的定义主要是为了帮助维护参照完整性,但如果表非常小,或者不太可能包含唯一的数据,则这是一种不必要的开销。在表上定义索引通常可以用来暗示主键而无需正式声明。然而,您应该考虑到,定义主键对于开发人员和模式生成或 SQL Dev 工具可能会很有用,因为元数据有助于理解,并且某些工具依赖于此来正确地定义模型中的主/外键关系。

0

嗯...

关系型数据库中的每个表都需要一个主键。正如已经指出的那样,主键是唯一标识记录的数据...

如果您有一个连接两个不同表的N-M表,并且您可以通过连接的两列的值唯一地标识记录,则可以不使用“ID”字段。 (组合主键)

在没有主键的情况下创建表违反了第一范式,这在关系型数据库中没有任何意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,