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.

это работает только на вновь созданные/усе таблицы, где