SQL identity (1,1), начиная с 0
у меня есть таблица SQL с набором идентификаторов:
CREATE TABLE MyTable(
MyTableID int IDENTITY(1,1) NOT NULL,
RecordName nvarchar(100) NULL)
что-то случилось с этой таблицей, что привело к странному поведению. Мне нужно выяснить, что.
при вставке:
INSERT MyTable(RecordName)
VALUES('Test Bug')
SELECT SCOPE_IDENTITY() -- returns 0
SELECT * FROM MyTable -- displays: 0, 'Test Bug'
это проблема, потому что код выше этой вставки ожидает, что первый идентификатор будет 1
- Я не могу понять, как с IDENTITY(1,1)
это заканчивается как 0
.
If (перед выполнением INSERT
) Я проверяю личность, которую он возвращает значение null:
DBCC CHECKIDENT (MyTable, NORESEED)
проверка идентификационной информации: текущее значение идентификатора "NULL", текущее значение столбца "NULL".
я знаю несколько способов исправить это; что мне нужно знать, как таблица попала в это состояние в первую очередь?
единственный способ, которым я это знаю CHECKIDENT
возвращает null, если таблица только что была создана, но затем IDENTITY(1,1)
почитается и то INSERT
причины SCOPE_IDENTITY()
на 1
.
кроме того, я могу get 0
как следующий ID, если я force -1
как текущее семя (DBCC CHECKIDENT (MyTable, RESEED, -1)
или SET IDENTITY_INSERT MyTable ON
) но тогда проверка сообщает, что текущий -1
seed (а не null), так что это не может быть тем, что произошло.
как база данных попала в состояние, когда столбец имеет IDENTITY(1,1)
, DBCC CHECKIDENT (MyTable, NORESEED)
возвращает null, но следующий INSERT
причины SCOPE_IDENTITY()
на 0
?
1 ответов
Я ожидаю, что кто-то / что-то побежал:
DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0);
если вы запустите следующий:
CREATE TABLE dbo.MyTable(
MyTableID int IDENTITY(1,1) NOT NULL,
RecordName nvarchar(100) NULL
);
DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0);
DBCC CHECKIDENT ('dbo.MyTable', NORESEED);
второй CHECKIDENT
возвращает NULL
:
проверка идентификационной информации: текущее значение идентификатора "NULL", текущее значение столбца "NULL".
однако следующее значение идентификатора будет 0. Это документированное поведение, MSDN заявляет:
текущее значение идентификатора устанавливается значение new_reseed_value. если строки не были вставлены в таблицу с момента ее создания, первая строка, вставленная после выполнения DBCC CHECKIDENT будет использовать new_reseed_value в качестве идентификатора. В противном случае следующая вставленная строка будет использовать new_reseed_value + 1. Если значение new_reseed_value меньше максимального значения в столбце identity, при последующих ссылках на таблицу будет создано сообщение об ошибке 2627.
это работает только на вновь созданные/усе таблицы, где