Ваш сценарий T-SQL неполный, так как генерируются значения IDENTITY, начиная с 1 (и заканчивая 5).
Примечание № 0: Я только пытаюсь описать некоторые причины для тех, которые не имеют значений IDENTITY.
Примечание № 1: не запускайте этот скрипт на рабочем сервере.
Примечание № 2: Использование IDENTITY
в определении столбца IDENTITY(1,1)
< =>IDENTITY(seed value/initial value=1,increment value=1)
.
Примечание № 3: Вам следует избегать использования DBCC CHECKIDENT
, если вы не знаете о consequences of this command.
Первое отсутствующее значение (возможное объяснение):
почему EmployeeID колонна начала с 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:
«Если ни одна строка не была вставлена в таблицу, так как таблица была создана, или , если все строки были удалены с помощью оператора TABLE TRUNCATE, первая строка вставляется после вас запустить DBCC CHECKIDENT использует new_reseed_value как тождество в противном случае, следующая строка вставляется использует new_reseed_value + текущее значение приращения "
последняя формула объясняет, почему этот раз первое значение IDENTITY равно 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
*/
«ИДЕНТИФИКАЦИЯ (1,1)» запустила бы столбец идентификации с шагом 1 с шагом 1. – user2989408
Проблема заключается в том, что имеет значение, если EmployeeID имеет пробелы. – Zane