Это все еще очень распространенная проблема среди многих разработчиков и приложений независимо от их размера.
К сожалению, приведенные выше предложения не исправляют все сценарии, т. Е. Виртуальный хостинг, вы не можете полагаться на то, что ваш хост установит параметр запуска -t272.
Кроме того, если у вас есть существующие таблицы, в которых эти столбцы идентификаторов используются в качестве первичных ключей, это ОГРОМНОЕ усилие, чтобы удалить эти столбцы и воссоздать новые, чтобы использовать обходной путь последовательности BS. Обходной путь Sequence хорош только в том случае, если вы разрабатываете новые таблицы с нуля в SQL 2012+.
Суть в том, что если вы используете Sql Server 2008R2, то ОСТАВАЙТЕСЬ НА НЁМ. Серьезно, держись. Пока Microsoft не признает, что они внесли ОГРОМНУЮ ошибку, которая все еще существует даже в Sql Server 2016, мы не должны обновляться, пока они не овладеют ею и не ИСПРАВЯТ ЭТО.
Microsoft прямо представила критическое изменение, то есть они сломали работающий API, который больше не работает должным образом, из-за того, что их система забывает свою текущую личность при перезапуске. Кэш или нет, это неприемлемо, и разработчик Microsoft по имени Брайан должен владеть им, вместо того, чтобы рассказывать миру, что это «по замыслу» и «фича». Конечно, кэширование — это функция, но потеря следа того, какой должна быть следующая идентичность, НЕ ЯВЛЯЕТСЯ ФУНКЦИЕЙ. Это чертов БАГ!!!
Я поделюсь обходным решением, которое я использовал, потому что мои БД находятся на серверах общего хостинга, а также я не удаляю и не воссоздаю свои столбцы первичного ключа, это было бы огромным PITA.
Вместо этого это мой позорный хак (но не такой позорный, как эта ошибка POS, которую представила Microsoft).
Взломать/Исправить:
Перед вашими командами вставки просто обновите свою личность перед каждой вставкой. Это исправление рекомендуется только в том случае, если у вас нет административного контроля над вашим экземпляром Sql Server, в противном случае я предлагаю выполнить повторное заполнение при перезапуске сервера.
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
Просто эти 3 строки непосредственно перед вашей вставкой, и все должно быть хорошо. Это действительно не сильно повлияет на производительность, т.е. будет незаметно.
Удачи.
person
green_mystic_Orb
schedule
07.03.2017
order by ReceiptNo
к своему запросу, действительно ли этих записей там нет? Вы уверены, что при вставке записей нет ошибок? Если запись пытается быть вставлена и терпит неудачу, идентификатор будет увеличиваться, то же самое, если записи удаляются. Если записи удаляются,ReceiptNo
не сбрасывается. Можете ли вы опубликовать таблицу создания для таблицыFee
? - person Taryn   schedule 03.01.20131206306
,1207306
,1207806
) означают, что объяснение в ветке Connect Item почти наверняка применимо. - person Martin Smith   schedule 04.01.2013