3

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

我的表中有一个 ID 列。在我的使用中,行被删除并重新创建了很多次。所以,如果我使用 SQL Server 的 Identity Increment 和 Identity Seed,ID 号会在一段时间后变得非常大......

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

如何在 SQL Server 中做到这一点?我应该禁用自动增量并手动设置 ID 吗?如何?

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

4

3 回答 3

7

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

不要过度设计这一点,也不要错误地认为标识值的大小或值应该有意义。这是仅为内部识别和效率而生成的替代值。如果你告诉用户这个值,那就有问题了。

于 2012-06-25T13:09:07.687 回答
1

您可以尝试使用此代码

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

于 2012-06-25T12:58:38.527 回答
1

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

另一种选择是重新编号 ID 并重新设定身份,但这也是很多工作。

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

您可以切换到一个可以扩展的 GUID,但它们会产生一个非常低效的索引,因此除非您将拥有超过 2^31 条记录,否则也不值得这样做。

正如其他人提到的那样,Bigint 会给你更大的范围,但当然更大的数字。:(

于 2012-06-25T13:01:17.360 回答