代码之家  ›  专栏  ›  技术社区  ›  Anyname Donotcare

数据库中的自动增量特性

  •  11
  • Anyname Donotcare  · 技术社区  · 14 年前

    主键。问题是有人告诉我,将字段设置为主键的自动递增意味着删除任何记录时(他们不关心自动递增字段号),字段会在某个点上增加,因此,如果字段的类型是整数,例如,整数的范围将被完全消耗,我将陷入麻烦。所以他们告诉我不要再使用这个功能了。

    1 其他智者 max + 1 .

    对这个问题有什么建议吗?我可以使用自动增量功能吗?

    我还想知道哪些情况是不可取的使用自动增量..和替代。。。

    注意:这个问题一般不针对任何DBMS,我想知道这是否也适用于像ORACLE、Mysql、INFORMIX等DBMS,。。。。

    非常感谢。

    5 回复  |  直到 14 年前
        1
  •  11
  •   Marek Grzenkowicz    14 年前

    您应该使用identity(自动递增)列。这个 bigint 数据类型可以存储值 (9223372036854775807)。我认为您的系统不会很快达到这个值,即使您正在插入和删除大量记录。

    锁定问题 约束冲突 (或者更糟- 非唯一值

        2
  •  8
  •   Adam Ralph    14 年前

    一个 int SQL Server中的数据类型可以保存-2147483648到2147483647之间的值。

    如果您的标识列中有-2147483648,例如。 FooId identity(-2,147,483,648, 1) 那么你就有超过40亿的价值观可以玩了。

    如果你真的认为这还不够,你可以用 bigint ,它可以保存从-9223372036854775808到9223372036854775807的值,但这几乎可以保证是过度的。即使数据量很大和/或事务量很大,在使用 内景 大整数 .

    总而言之,您应该使用一个identity列,不应该关心值中的间隙,因为a)您有足够的候选值,b)它是一个没有逻辑意义的抽象数字。

    如果要实现您建议的解决方案,在代码派生下一个标识列时,您必须考虑并发性,因为您必须同步访问两个竞争事务之间的当前最大身份值。实际上,您可能会导致性能显著下降,因为您必须先读取最大值,计算然后插入(更不用说同步并发事务所涉及的额外工作)。但是,如果使用标识列,则数据库引擎将为您处理并发性。

        3
  •  3
  •   TechTravelThink    14 年前

    继续在SQL Server中对PK使用标识功能。在mysql中,还有自动增量功能。别担心你的整数范围用完了,在这之前你的硬盘空间就用完了。

        4
  •  3
  •   Erik Funkenbusch    14 年前

    您可以通过锁定表或捕获异常来解决该问题,并继续重新插入。。但那是一种很糟糕的做事方式。锁定将降低性能并导致可伸缩性问题(如果您计划的记录数量与担心int溢出的数量一样多,那么您将需要可伸缩性)。

    如果担心标识字段可能溢出,请使用较大的数据类型,如bigint。您将很难生成足够的记录来溢出它。

    现在,有正当理由不使用标识字段,但这不是其中之一。

        5
  •  1
  •   Marek Grzenkowicz    14 年前

    我建议您使用Hi/Lo生成器,如果您通常通过程序访问数据库,并且不依赖于手动向DB发送insert语句。你可以在第二个链接中阅读更多关于它的内容。