【问题标题】:Does the starting seed matter for sql server identity columnsql server 标识列的起始种子是否重要
【发布时间】:2017-07-04 16:47:13
【问题描述】:

在 SQL Server 中为标识列设置种子值时是否有任何技术考虑?

此列将是 PK 并标记为身份自动递增。

企业不希望从 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 );

【问题讨论】:

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

标签: sql-server tsql database-design primary-key


【解决方案1】:

我认为从某个随机的未来数字开始没有任何问题。

【讨论】:

    【解决方案2】:

    将一些 cmets 总结为一个答案。

    起始标识值需要考虑表中已有的任何值。因为 ID 会自动递增,如果 ID 播种得太低,它可能会与现有值发生冲突。

    ID 序列中可能会出现较大的间隙。不管多么不可能,高起始种子和许多间隙可能会导致列的 INT 范围用尽。然后应用就火爆了!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 2016-10-18
      • 2017-05-21
      • 1970-01-01
      • 2010-10-18
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多