【发布时间】: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