Vložil jsem záznamy do tabulky databáze SQL Server. V tabulce byl definován primární klíč a nastavení automatické inkrementace identity je nastaveno na "Ano". To se dělá především proto, že v SQL Azure musí mít každá tabulka definovaný primární klíč a identitu.
Protože však musím z tabulky odstranit některé záznamy, dojde k narušení semínka identity těchto tabulek a naruší se sloupec indexu (který je automaticky generován s přírůstkem 1).
Jak mohu po smazání záznamů obnovit sloupec identity tak, aby měl sloupec pořadí ve vzestupné číselné řadě?
Sloupec identity se nikde v databázi nepoužívá jako cizí klíč.
Příkaz pro správu DBCC CHECKIDENT
slouží k vynulování čítače identity. Syntaxe příkazu je:
DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]
Příklad:
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
V předchozích verzích Azure SQL Database nebyl podporován, ale nyní je podporován.
Upozorňujeme, že argument new_reseed_value
se v různých verzích SQL Serveru liší podle dokumentace:
Pokud jsou v tabulce řádky, vloží se další řádek s hodnotou new_reseed_value. Ve verzi SQL Server 2008 R2 a starší se pro další vložený řádek použije new_reseed_value + aktuální hodnota přírůstku.
Tuto informaci však považuji za zavádějící* (ve skutečnosti za prostě chybnou), protože pozorované chování naznačuje, že přinejmenším SQL Server 2012 stále používá logiku new_reseed_value* + aktuální přírůstková hodnota. Společnost Microsoft si dokonce protiřečí s vlastním Příkladem C
, který najdete na stejné stránce:
C. Vynucení aktuální hodnoty identity na novou hodnotu
Následující příklad vynucuje aktuální hodnotu identity v položce sloupci AddressTypeID v tabulce AddressType na hodnotu 10. Protože tabulka má existující řádky, další vložený řádek použije hodnotu 11. jako hodnota, tedy nová aktuální přírůstková hodnota definovaná pro pole >. sloupce plus 1.
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
Přesto vše zůstává možnost odlišného chování v novějších verzích SQL Serveru. Myslím, že jediným způsobem, jak si být jistý, dokud Microsoft nevyjasní věci ve své vlastní dokumentaci, je provést skutečné testy před použitím.