MS SQL标识列在标识列上计数不正确
我正在使用MS SQL Server。有人能告诉我,为什么我的数据库中的身份栏在自动递增1的情况下,数字却急剧增加?首先,我一直在逐行输入数据。最终,在100个条目之后,它会将它们放置在不整齐的位置,在31个条目之后放置101个条目。现在,它突然从290年跳到了1400年,那时它应该还处于正常状态。。。。管理工具仍然显示了正确的条目数量,但它只是没有意义,这是如何计数一。有人能给我解释一下吗MS SQL标识列在标识列上计数不正确,sql,sql-server,coldfusion,Sql,Sql Server,Coldfusion,我正在使用MS SQL Server。有人能告诉我,为什么我的数据库中的身份栏在自动递增1的情况下,数字却急剧增加?首先,我一直在逐行输入数据。最终,在100个条目之后,它会将它们放置在不整齐的位置,在31个条目之后放置101个条目。现在,它突然从290年跳到了1400年,那时它应该还处于正常状态。。。。管理工具仍然显示了正确的条目数量,但它只是没有意义,这是如何计数一。有人能给我解释一下吗 插入dbo.Users(员工号、用户名、用户名、密码、姓氏、职位、电子邮件、电话分机、分行、部门、状
插入dbo.Users(员工号、用户名、用户名、密码、姓氏、职位、电子邮件、电话分机、分行、部门、状态、图片、管理员)
价值(
,
,
,
,
,
,
,
,
,
,
,
,
)
self.location=“../login.cfm”;
警报(“非图像文件”);
self.location=“../register.cfm”;
保证数字是单调递增的,但不是相邻的。这是一些相关的文件
通常,标识列也被约束为唯一键或主键。但是,如果没有这些约束,它们甚至不能保证是唯一的
它们确实在增加。奇怪的行为是为了效率,特别是在并行系统中
如果需要,在查询时很容易获得无间隙的连续值:
select row_number() over (order by id) as sequential_with_no_gaps
因为这就是标识值的定义方式。它们保证是单调递增的,但不是没有间隙的。它们最终会填补这些数字吗?还是会永远被忽略?抱歉看起来很可笑,就像我选择增加1时跳过的意义是什么…我也觉得有点奇怪,但不知道为什么它很重要。通常情况下,您并不依赖于id是连续的,只需要它们是唯一的。如果需要插入新记录的id,请使用cfquery的result属性。它返回一个包含生成的id的结构。请参阅
result.generatedKey
和result.identityCol
…在数据库故障或服务器重新启动期间,某些指定的值可能会丢失。这可能导致插入时标识值出现间隙。呵呵。我认为这些漏洞可能是由于删除或在上插入标识造成的。每天学点新东西……多读一点,听起来也像是?@Leigh。我相信这个问题在2008年就存在了。在任何情况下,规则都很简单:将identity
列定义为unique
。那么,不要期望它们是无间隙的。它们将形成一个单调序列。如果您真的想要无间隙,请使用序列,但这会带来额外的开销,特别是在高容量事务环境中。是的,我使用标识值的方式不会导致连续值成为问题,但如果经常发生,则对于整数列而言,在pop处使用1000 id似乎会损失很多。。。从现在开始,在选择id数据类型时,我肯定会考虑一些事情。@Leigh。如果你在网上搜索,你会找到解释。我认为这与在大型插入期间在并行环境中保留值有关。这是有充分理由的。
select row_number() over (order by id) as sequential_with_no_gaps