Jest to nadal bardzo częsty problem wśród wielu programistów i aplikacji, niezależnie od rozmiaru.
Niestety powyższe sugestie nie rozwiązują wszystkich scenariuszy, np. Hosting współdzielony, nie możesz polegać na swoim hoście, aby ustawić parametr uruchamiania -t272.
Ponadto, jeśli masz istniejące tabele, które używają tych kolumn tożsamości jako kluczy podstawowych, OGROMNY wysiłek jest porzucenie tych kolumn i odtworzenie nowych, aby użyć obejścia sekwencji BS. Obejście sekwencyjne jest dobre tylko wtedy, gdy projektujesz tabele od podstaw w SQL 2012+
Najważniejsze jest to, że jeśli korzystasz z Sql Server 2008R2, POZOSTAŃ ON IT. Poważnie, trzymaj się tego. Dopóki Microsoft nie przyzna, że wprowadził OGROMNY błąd, który nadal występuje nawet w Sql Server 2016, nie powinniśmy aktualizować, dopóki nie są właścicielami i NAPRAWIĆ.
Microsoft od razu wprowadził przełomową zmianę, tj. Złamał działające API, które nie działa już zgodnie z założeniami, ponieważ ich system zapomina o swojej aktualnej tożsamości przy ponownym uruchomieniu. Pamięć podręczna lub brak pamięci podręcznej, jest to niedopuszczalne, a deweloper firmy Microsoft o nazwisku Bryan musi ją posiadać, zamiast mówić światu, że jest to „zgodne z projektem” i „funkcją”. Jasne, buforowanie jest funkcją, ale utrata świadomości, jaka powinna być następna tożsamość, NIE JEST FUNKCJĄ. To niezły BŁĄD !!!
Podzielę się obejściem, którego użyłem, ponieważ moje bazy danych znajdują się na serwerach Shared Hosting, a także nie upuszczam i nie odtwarzam moich kolumn klucza podstawowego, to byłby ogromny PITA.
Zamiast tego jest to mój haniebny hack (ale nie tak haniebny, jak ten błąd POS, który wprowadził Microsoft).
Hack / Fix:
Przed wykonaniem poleceń wstawiania po prostu ponownie ustaw swoją tożsamość przed każdym wstawieniem. Ta poprawka jest zalecana tylko wtedy, gdy nie masz kontroli administratora nad instancją Sql Server, w przeciwnym razie sugeruję ponowne wprowadzenie po ponownym uruchomieniu serwera.
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)
Tylko te 3 wiersze bezpośrednio przed wstawką i powinno być dobrze. Naprawdę nie wpłynie to tak bardzo na wydajność, tj. Będzie niezauważalne.
Powodzenia.
order by ReceiptNo
do zapytania, czy naprawdę nie ma tych rekordów? Czy na pewno podczas wstawiania rekordów nie ma błędów? Jeśli rekord próbuje się wstawić i nie powiedzie się, tożsamość będzie się zwiększać, to samo, jeśli rekordy zostaną usunięte. Usunięcie rekordówReceiptNo
nie powoduje zresetowania. Czy możesz opublikować tworzenie tabeli dlaFee
stołu?