【问题标题】:BigInt doesn't generate enough primary keys for a given table [duplicate]BigInt 没有为给定表生成足够的主键 [重复]
【发布时间】:2020-09-02 20:00:00
【问题描述】:

忽略在数据库中的给定表上生成 18446744073709551615 行的不切实际性质。假设它发生了。如果您必须创建第二个表以继续存储要引用的相同数据,您是否能够保持数据完整性。

【问题讨论】:

  • 具体的数据库是什么?
  • 1^19 行的 SQL 表在许多其他方面都是不现实的,因此很难忽视。
  • 考虑使用 UUID。
  • 这是一个常见问题解答。 (并且可以预期。)在考虑发布之前,请阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和网站:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 这个问题并没有那么不合理。并行系统上的标识列经常有差距——1,000,000 的差距对于未来的系统来说并非不合理。并非所有 id 都存储在表中,但通常与某种操作相关联(例如失败的事务)。我可以想象即使是 bigint 也不够大的系统。然而,这对于 StackOverflow 来说是一个糟糕的问题,因为发生的事情显然取决于数据库和系统的配置。

标签: sql database database-design


【解决方案1】:

有时只有必须处理的限制。有时您只需要记录该限制并继续前进。因此,创建您的序列并记录限制。所以

create sequence long_range_sequence
       minvalue   -9223372036854775808
       no maxvalue
       start with -9223372036854775808
       increment  1;
comment on sequence long_range_sequence is  
        'Warning: Excessive Usage. Created on May 2020. If values are constantly used at the rate of 10M/sec ranges values will run out sometime July 60473.'

稍后让维护处理。当然,到那时,这可能是一个没有实际意义的问题。

【讨论】:

    【解决方案2】:

    你没有提到你使用的是哪个数据库,所以我会给你一些选择:

    1. 某些数据库可以为您提供可以克服此限制的 UUID,因为它们提供 128 位值。

    2. 如果您使用的是 PostgreSQL 数据库,那么您可以拥有多个 64 位 IDENTITY(自动生成)列。如果你巧妙地使用它们,你可以拥有超过 2^64 个值。

    3. 如果您使用的是 Oracle,则可以使用序列生成高达 10^27 的值。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 2017-03-28
      • 2020-01-04
      • 2014-06-18
      • 2013-05-09
      • 1970-01-01
      • 2017-01-28
      • 2011-02-09
      相关资源
      最近更新 更多