数据库中的自动增量功能

Any*_*are 11 mysql database sql-server asp.net sql-server-2005

我使用SQL Server,当我创建一个新表时,我将特定字段设置为自动增量主键.问题是有些人告诉我,当删除任何记录(它们不关心自动增量字段编号)时,字段是主键的自动增量,字段在某些时候增加 - 如果我的字段的类型是例如整数 - 整数范围将被完全消耗,我将遇到麻烦.所以他们告诉我不要再使用这个功能了.

最好的解决方案是通过获取我的主键的最大值来完成代码,然后如果该值不存在则max将是1另一个明智的max + 1.

有关此问题的任何建议吗?我可以使用自动增量功能吗?

我还想知道不喜欢使用自动增量的情况......以及替代方案......

注意::这个问题一般不是特定于任何DBMS,我想知道这也适用于DBMS,如ORACLE,Mysql,INFORMIX,....

非常感谢.

Mar*_*icz 11

您应该使用标识(自动增量)列.的BIGINT数据类型可以存储值达到2 ^ 63-1(9,223,372,036,854,775,807).即使您插入和删除大量记录,我认为您的系统不会很快达到此值.

如果您正确实施了建议的方法,最终会遇到很多锁定问题.否则,您将不得不处理因约束违规而抛出的异常(或者甚至更糟 - 非唯一值,如果没有主键约束).

  • +1.此外,不要忘记,如果你走最大+ 1路线,你仍然会有所有这些"漏洞" - 如果你只删除最后输入的记录,这只会产生影响. (3认同)

Ada*_*lph 8

intSQL Server中的数据类型可以包含从-2,147,483,648到2,147,483,647的值.

如果您使用-2,147,483,648为您的标识列播种,例如,FooId identity(-2,147,483,648, 1)那么您可以使用超过40亿个值.

如果你真的认为这仍然不够,你可以使用a bigint,它可以保持从-9,223,372,036,854,775,808到9,223,372,036,854,775,807的值,但这几乎可以保证是过度的.即使存在大量数据和/或大量事务,在使用时也可能耗尽磁盘空间或耗尽应用程序的生命周期int,并且几乎可以肯定在使用时使用bigint.

总而言之,你应该使用一个标识列,你不应该关心值中的空白,因为a)你有足够的候选值和b)它是一个没有逻辑意义的抽象数字.

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

  • 抽象数 - 它的唯一目的是保持某种独特的价值 - 它没有其他用途,因此,如果数字序列是1,3,4,5,18,19,105,108,1006,10020230它没有'因为数字本身没有意义.唯一的考虑因素是是否有足够的价值,如上所述,有. (2认同)