我创建了一个以tblEmployees代码命名的表-
Create table tblEmployees
(
EmployeeID int identity primary key,
Name nvarchar(30),
Salary float,
Gender tinyint
)
Run Code Online (Sandbox Code Playgroud)
然后我插入值 -
insert into tblEmployees values ('Akmal', 5000, 0)
insert into tblEmployees values ('Shakira', 6000, 1)
insert into tblEmployees values ('Kiron', 7000, 2)
insert into tblEmployees values ('Jamil', 5500, 0)
insert into tblEmployees values ('Faul', 4800, 4)
Run Code Online (Sandbox Code Playgroud)
但是,当显示值时 -
EmployeeID Name Salary Gender
2 Akmal 5000 0
3 Shakira 6000 1
4 Kiron 7000 2
5 Jamil 5500 0
7 Faul 4800 4
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么EmployeeID列以2开头?6在哪里?这不应该自动增加吗?
Aar*_*and 15
不要依赖IDENTITY列来生成一组没有间隙的连续值.期.这根本不能保证; 有些事情可能导致诸如回滚,删除,重新种植等缺陷.我不相信你用上面的确切代码重现了这个问题; 这些INSERT陈述之间可能还有其他活动.
对于这种代理和无意义的价值观,你真的不应该关心是否存在差距.如果您关心差距,请使用不同的技术(例如,可序列化的max()+ 1解决方案) - 请注意您为可伸缩性/并发性问题交换差距.另一个答案(你接受了,但我怀疑会被删除)说:
如果要使用具有可靠和指定值的标识列,则需要在该列上将IDENTITY_INSERT设置为ON,插入值(使用特定ID值),然后将IDENTITY_INSERT设置为OFF.
仅当您已知道要插入该列的值时,此方法才有效.这首先击败了该IDENTITY物业的目的.如果您还不知道要插入哪些值(例如"下一步"是什么ID),则表示您需要SELECT MAX()从表中添加1,然后添加1.这意味着整个事物需要可序列化,否则其他人可以读取相同的MAX()值并添加相同的值+1.因此,IDENTITY如果您总是要覆盖生成的值,那么除了使属性无用之外,它还会通过有效地将并发性限制为1来杀死可伸缩性.我强烈建议您在实现之前强烈权衡该方法.
我建议你做的是使用一个IDENTITY柱子,不要挂在间隙上.它们会发生,你可以做的并不多,而且无论如何它都不应该成为一个问题.谁在乎是否没有员工#6?