【问题标题】:Consensus? MySQL, Signed VS Unsigned Primary/Foreign Keys共识? MySQL,有符号 VS 无符号主键/外键
【发布时间】:2025-12-19 09:20:10
【问题描述】:

我已经看到了一些关于现在每个人在签名和未签名键值方面都在做什么的帖子。似乎 unsigned 是最优的,因为它允许两倍的行数以相同的成本。签名密钥有什么好处吗?

有没有标准的共识?似乎签名是答案,因为“一直都是这样”

【问题讨论】:

    标签: mysql integer primary-key unsigned signed


    【解决方案1】:

    如果我的列不能为负数,我更喜欢将它们设置为unsigned。除了你提到的范围因素之外,它还可以在阅读表定义时更加清晰。

    【讨论】:

      【解决方案2】:

      一个有符号的 32 位 int 可以表示超过 20 亿个数字,所以我怀疑这个问题对大多数人来说是没有实际意义的。也就是说,当我想表明一条记录是故意孤立的时,我经常使用负数。

      【讨论】:

      • 哎呀!抱歉,我使用的应用程序有人(不再在公司工作)认为这是一个好主意。从字面上看,至少每周一次,我们会发现由这种疯狂的设计决定引起的某种问题(新代码的挑战或现有代码中的错误)。 您不应该赋予主键超出键值本身的含义,并且您永远不应该更改主键值。如果要指示软删除,请使用状态列或 softDeleted 列。因为它是软件的一个基本部分,所以我们现在才对其进行修复,作为主要重写的一部分。
      • @gregmac s'ok,我知道这会引起争议。颇具讽刺意味的是,“孤儿”这个更好的词应该是“存在的”。这是一个具有讽刺意味的术语选择,因为我提出了这个方案来代表我只知道必须存在的人。我的应用程序允许用户说 Bob 和 Charlie 是兄弟,但内部存储了他们的记录,其父列都引用了带有负键的记录。如果有人将 Jane 添加为 Bob 的妈妈,我也可以更新 Charlie。一般来说,当我想说存在一些其他事物必须靠近的事物时,我会使用该模式。
      • 另外,我非常熟悉主键不应该有意义的学说。更好的格言是意义应该被封装。 PK 对应用程序层没有任何意义,但它们对数据库(管理系统)本身确实有意义。在我上面描述的方案中,我只是将 PK 用作元数据。顺便说一句,我之前在这里讨论过这个:*.com/questions/2023988/…
      • 使用负数表示孤立是一种不好的做法。隐式行为,即使已记录在案,也会导致代码混乱。不仅如此,如果您使用代理键,例如在这种情况下,代理键的含义应该是行标识。顺便说一句,如果您出于某种原因超过 2B 记录,您将开始插入具有负值的行,并且您的应用程序的行为将是错误的。这很糟糕。