您的T-SQL腳本不完整,因爲我的IDENTITY值是從1(以5結尾)開始生成的。
注#0:我只是試圖描述一些缺少IDENTITY值的原因。
注意#1:不要在生產服務器上運行此腳本。
注2:列定義中使用IDENTITY
裝置IDENTITY(1,1)
< =>IDENTITY(seed value/initial value=1,increment value=1)
。
注意#3:如果您不知道consequences of this command,您應該避免使用DBCC CHECKIDENT
。
的第一遺漏值(一個可能的解釋):
爲什麼僱員柱開始2?
運行以下腳本:
IF OBJECT_ID(N'dbo.tblEmployees') IS NOT NULL
DROP TABLE dbo.tblEmployees;
GO
Create table tblEmployees
(
EmployeeID int identity primary key,
Name nvarchar(30),
Salary float,
Gender tinyint
)
GO
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)
GO
SELECT SCOPE_IDENTITY() AS [Last IDENTITY #1];
/*
Last IDENTITY #1
----------------
5
*/
GO
此時此表中生成的最後IDENTITY值(因爲你可以看到)5,而不是7(如你的例子)。
SELECT * FROM dbo.tblEmployees;
/*
EmployeeID Name Salary G
----------- ------------------------------ ---------------------- -
1 Akmal 5000 0
2 Shakira 6000 1
3 Kiron 7000 2
4 Jamil 5500 0
5 Faul 4800 4
*/
GO
所有行都有連續的IDENTITY值:沒有間隙。
現在,由於種種原因,有人將刪除所有dbo.tblEmployees
行還決定重置(RESEED)的最後一個標識值(5)到1(從5到1)。
DELETE dbo.tblEmployees;
GO
DBCC CHECKIDENT('dbo.tblEmployees', RESEED, 1);
GO
SELECT SCOPE_IDENTITY() AS [Last IDENTITY #2];
/*
Last IDENTITY #2
----------------
1
*/
GO
現在,最後的IDENTITY值是1(因爲RESEED 1)。
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)
GO
SELECT * FROM dbo.tblEmployees;
GO
/*
EmployeeID Name Salary Gender
----------- ------------------------------ ---------------------- ------
2 Akmal 5000 0
3 Shakira 6000 1
4 Kiron 7000 2
5 Jamil 5500 0
6 Faul 4800 4
*/
當我再次插入這些行時,第一次生成的IDENTITY值是2(這次)。
爲什麼?究其原因,MSDN描述:
「如果沒有行已插入到表中,因爲表的創建,或如果全部行已經通過 TRUNCATE TABLE語句刪除,第一行後,您插入運行DBCC CHECKIDENT使用new_reseed_value作爲身份 否則,插入的下一行使用new_reseed_value +當前增量值「
這最後一個公式解釋了爲什麼這一次的第一身份值是2:
new_reseed_value(是1 - 因爲RESEED 1)+當前增量值(1-參見注釋#2)= 1 + 1 = 2。
注#4:如果使用的TRUNCATE TABLE
代替DELETE
然後TRUNCATE TABLE
之後插入第一行將具有ID =種子值(見注2)或new_reseed_value = 1。因此,在這種情況下,不這樣做需要DBCC(..., RESEED, 1)
。
第二缺失值(一個可能的解釋):
在哪裏是6?
DELETE dbo.tblEmployees WHERE EmployeeID = 6
insert into tblEmployees values ('Faul', 4800, 4)
GO
SELECT SCOPE_IDENTITY() AS [Last IDENTITY #3];
/*
Last IDENTITY #3
----------------
7
*/
GO
SELECT * FROM dbo.tblEmployees;
GO
/*
EmployeeID Name Salary Gender
----------- ------------------------------ ---------------------- ------
2 Akmal 5000 0
3 Shakira 6000 1
4 Kiron 7000 2
5 Jamil 5500 0
7 Faul 4800 4
*/
'IDENTITY(1,1)'本應以1爲增量開始標識列。 – user2989408
問題在於,如果EmployeeID存在差距,它就很重要。 – Zane