【发布时间】:2009-04-08 00:59:53
【问题描述】:
假设您有一个只包含一行的汇总表(存储有关另一个表的一行统计信息)。在这种情况下,我使用 InnoDB 以便我可以更新它以及它旨在包含事务摘要的表。我应该让这个表有一个主键吗?如果是这样,什么,只是一个总是等于 1 的 tinyint?
【问题讨论】:
-
总体思路:不,您不需要一个,但请注意不要得到两个相同的记录。
假设您有一个只包含一行的汇总表(存储有关另一个表的一行统计信息)。在这种情况下,我使用 InnoDB 以便我可以更新它以及它旨在包含事务摘要的表。我应该让这个表有一个主键吗?如果是这样,什么,只是一个总是等于 1 的 tinyint?
【问题讨论】:
InnoDB 如果您不提供主键,将为您创建一个隐藏的主键。
有时访问此密钥会更容易,因为
INSERT
...
ON DUPLICATE KEY UPDATE
可以用来更新这个表,不管它是否已经有值。
是的,只需使用常量1。
【讨论】:
我认为你应该,你不知道将来是否可以使用同一个表来存储其他表的统计信息,这似乎是存储它们的好地方,那么你需要识别每一行桌子。
【讨论】:
鉴于大多数其他答案是“不,你不需要一个”,我将提供一个魔鬼代言人的答案。
主键约束可确保您不会在应用约束的列中获得具有重复值的行。你说你打算让这个表有一行,那么为什么不你声明约束呢?它可以帮助防止重复,这正是您想要的。
【讨论】:
我会在上面放一个标识列(我不知道 InnoDB 等价物是什么)。这样做是无害的,并且如果您需要,可以更轻松地选择或删除特定行。
【讨论】:
我从不在这种情况下打扰。 PK 用于与其他记录区分开来,在这种情况下没有。
【讨论】:
如果您打算扩展此表怎么办?定义一个键可能是有意义的。同样,这只是一种意见,对您而言并非必需品。
【讨论】:
目前我不会介绍 PK。如果您决定将此表也用于其他记录,只需重构并添加一个新行(无论如何您可能都需要)(过早优化)。添加这样一个 PK 的原因还有一个:如果您使用的框架在没有标识记录的 PK 的情况下无法更新记录。
【讨论】: