Sql server sql server标识列的起始种子是否重要

Sql server sql server标识列的起始种子是否重要,sql-server,tsql,database-design,primary-key,Sql Server,Tsql,Database Design,Primary Key,在SQL server中设置标识列的种子值时,是否有任何技术考虑事项 此列将是主键,并标记为标识自动递增 企业不希望在1开始ID,因为它们将在查询字符串中公开可见,并显示在多个页面上。使用更高的随机数会使它看起来更好,这对我来说都是有意义的,我想确保我没有遗漏任何技术方面的考虑 这是我将要做的一个例子 --Reset manufacturer id to a Random 5 digit number DECLARE @newId INT = (SELECT FLOOR(RAND() * 100

在SQL server中设置标识列的种子值时,是否有任何技术考虑事项

此列将是主键,并标记为标识自动递增

企业不希望在1开始ID,因为它们将在查询字符串中公开可见,并显示在多个页面上。使用更高的随机数会使它看起来更好,这对我来说都是有意义的,我想确保我没有遗漏任何技术方面的考虑

这是我将要做的一个例子

--Reset manufacturer id to a Random 5 digit number
DECLARE @newId INT = (SELECT FLOOR(RAND() * 100000) + 10000  % 10000) 
DBCC CHECKIDENT (Manufacturer, RESEED, @newId );

我看不到从某个随机未来数开始有任何问题。

我看不到从某个随机未来数开始有任何问题。

将一些评论总结成一个答案

开始标识值需要考虑表中已经存在的任何值。由于ID将自动递增,因此如果ID种子设定过低,它可能会与现有值冲突

ID序列中可能出现较大的间隙。但不太可能,高起始种子和许多间隙可能会导致列的INT范围用尽。然后应用程序就开始繁荣了


列上的任何索引都不应该关心它是从1开始还是从99999开始。

将一些评论总结成一个答案

开始标识值需要考虑表中已经存在的任何值。由于ID将自动递增,因此如果ID种子设定过低,它可能会与现有值冲突

ID序列中可能出现较大的间隙。但不太可能,高起始种子和许多间隙可能会导致列的INT范围用尽。然后应用程序就开始繁荣了


列上的任何索引都不应该关心它是从1还是99999开始。

如果table.ID列中已有值,则重新设定种子可能会有问题。通常,您需要确保它高于现有值。(Lower也可以工作,但它更复杂)这种东西不应该在查询字符串中可见。这是一个很大的危险信号,表明您的代码设计得不好。这可能意味着用户可以更改查询字符串并查看属于其他人的数据。老实说,这通常不是用户应该看到的值。没有技术上的原因,你不能以你想要的任何价值启动它。但请记住,您可以并且将定期获得较大的间隙。@rbaryyoung没错,我的表将完全为空。我同意@SeanLange,您不能使用虚拟guid/
唯一标识符来从数据库外部引用吗?@SqlZim我认为我的示例有误导性,对此表示抱歉。将在其上使用的真实实体是完全公开和可搜索的,类似于SO问题及其ID。它的工作原理类似于
http://mysite/search/details?id=83833
。另外,与实体相关的一些可打印文档将携带ID,如
报告#:83833
。我们可以创建一些不是PK的别名,这是一个需要考虑的问题。如果表中的值已经在ID栏中,则重新分配可能是个问题。通常,您需要确保它高于现有值。(Lower也可以工作,但它更复杂)这种东西不应该在查询字符串中可见。这是一个很大的危险信号,表明您的代码设计得不好。这可能意味着用户可以更改查询字符串并查看属于其他人的数据。老实说,这通常不是用户应该看到的值。没有技术上的原因,你不能以你想要的任何价值启动它。但请记住,您可以并且将定期获得较大的间隙。@rbaryyoung没错,我的表将完全为空。我同意@SeanLange,您不能使用虚拟guid/
唯一标识符来从数据库外部引用吗?@SqlZim我认为我的示例有误导性,对此表示抱歉。将在其上使用的真实实体是完全公开和可搜索的,类似于SO问题及其ID。它的工作原理类似于
http://mysite/search/details?id=83833
。另外,与实体相关的一些可打印文档将携带ID,如
报告#:83833
。我们可以创建一些不是PK的别名,而是要考虑的事情。