SQL身份增量和种子

时间:2012-06-25 12:53:51

标签: c# sql sql-server sql-server-2005

我正在使用Microsoft SQL Server作为我的数据库。

我的表格中有一个ID列。在我的使用中,行被删除并重新创建多次。因此,如果我使用SQL Server的身份增量和身份种子,一段时间后ID号会非常大......

每个新行的ID都大于其他行并不重要。它必须是独一无二的。

如何在SQL Server中执行此操作?我应该禁用自动增量并手动设置ID吗?如何?

我正在使用C#和SQL Server Express。

3 个答案:

答案 0 :(得分:7)

我不确定你为什么关心这些数字是大还是小(希望用户没有感情价值或对身份价值赋予任何意义),但避免用尽问题的一种方法是使用BIGINT 。我忘记了确切的数字,但是如果你每秒生成1000个ID就需要80年左右才能达到极限 - 如果从负边界开始,你可以加倍。是BIGINT是8个字节而不是4个字节但是它仍然比GUID小得多且可用。如果你将它与数据压缩相结合,那么在你使用了20亿个数字之后,你将不再需要任何存储而不是INT。

不要对此进行过度设计,也不要误认为身份值的大小或值应该是什么意思。这是仅为内部识别和效率生成的替代值。如果你告诉用户这个价值,那就不对了。

答案 1 :(得分:1)

您可以尝试使用此代码

- 禁用身份 SET IDENTITY_INSERT YourSchema.YourTable OFF GO

答案 2 :(得分:1)

除非你想搞砸很多东西,即只在存储过程中添加东西,要么使用选择Max(ID)或带有next_ID的表,处理多用户访问等,你就会陷入困境2005年(SQL 2012引入了序列,显然)。

其他选项是重新编号ID并重新设置身份,但这也是很多工作。

除了大数字不是问题之外,它们只占用四个字节,与小字节相同。翻滚是一个问题当然,但这需要一段时间才能做到!

你可以翻转到一个可以扩展的GUID,但是它们会产生一个效率非常低的索引,所以除非你有超过2 ^ 31个记录,否则它也不值得。

正如其他人所说,Bigint会给你更大的范围,但当然还有更大的数字。 :(