Tag Archives: Identity

Přenastavení počítadla pro identity sloupec (Identity Seed, RESEED)

Přenastavení počítadla pro identity sloupec na 1:

DBCC CHECKIDENT (MyTable, RESEED, 1)

Počítadlo vyresetuje na výchozí hodnotu i TRUNCATE TABLE, který slouží pro vymazání celé tabulky.

Více o DBCC CHECKIDENT [MSDN].

Roman Krejčí update:

1) syntaxe příkazu v dokumentaci je přesně

DBCC CHECKIDENT ('MyTable', RESEED, new_reseed_value)

to jest nazev tabulky by měl být v uvozovkách. Uvozovky jsou však vyžadovány jen pokud je název tabuky „multipart“, to jest je tvaru katalog.dbo.table_name. Pokud je název uveden jako single-part (bez kvalifikace katalogem a vlastníkem), lze uvozovky vynechat (ale lze je i nevynechat).

2) Hodnota new_reseed_value se použije takto – pokud od vytvoření tabulky do provedení příkazu DBCC do ní nebyl vložen žádný záznam, bude mít první vložený záznam v IDENTITY sloupci hodnotu přímo new_reseed_value. Pokud tabulka už nějaké záznamy obsahuje, bude IDENTITY sloupec v dalším přidaném záznamu obsahovat hodnotu (new_reseed_value + identity_increment), kde identity_increment je inkrement počítadla zadaný při vytvoření tabulky (lze zjistit jako select IDENT_INCR(TABLE_NAME))

@@IDENTITY vs. SCOPE_IDENTITY()

Velmi často se setkávám se zaměňováním „funkcí“ @@IDENTITY a SCOPE_IDENTITY(). Obě dvě dvě představují hodnotu identity-sloupce posledního INSERTu, nicméně každý trochu jinak definovanou a v určitých případech se mohou jejich výsledky lišit.

Definice

@@IDENTITY představuje poslední vloženou identity hodnotu v kontextu celé session, veškeré její aktivity.

SCOPE_IDENTITY() představuje poslední vloženou identity hodnotu v kontextu aktuálního scope, v nejužším slova smyslu.

Příklad

Mějme tabulku Table1 s identity-column a k ní insert trigger, který vkládá hodnotu do druhé tabulky Table2 opět s identity-column. A tady je rozdíl, pokud zavoláme dávku

INSERT INTO Table1 DEFAULT VALUES

SELECT @@IDENTITY         -- vrátí identity hodnotu Table2 z triggeru
SELECT SCOPE_IDENTITY()   -- vrátí identity hodnotu Table1

…s použitím @@IDENTITY si můžeme pěkně naběhnout.

IDENT_CURRENT(‚table‘)

Funkce IDENT_CURRENT(‚tablename‘) vrací poslední hodnotu identity-column tabulky, nezávisle na session či scope.