sql >> Databáze >  >> RDS >> Sqlserver

Proč jsou v hodnotách sloupce IDENTITY mezery?

Vlastnost identity ve sloupci nezaručuje následující :

Unikátnost hodnoty – Jedinečnost musí být vynucena použitím PRIMARY KEY nebo UNIQUE omezení nebo UNIQUE indexu.

Po sobě jdoucí hodnoty v rámci transakce – Není zaručeno, že transakce vkládající více řádků získá po sobě jdoucí hodnoty pro řádky, protože v tabulce se mohou vyskytnout další souběžné vkládání. Pokud musí být hodnoty po sobě jdoucí, transakce by měla používat exkluzivní zámek na stole nebo použít úroveň izolace SERIALIZABLE.

Po sobě jdoucí hodnoty po restartu serveru nebo jiných selháních – SQL Server může z důvodů výkonu ukládat hodnoty identity do mezipaměti a některé z přiřazených hodnot mohou být ztraceny během selhání databáze nebo restartu serveru. To může mít za následek mezery v hodnotě identity po vložení. Pokud mezery nejsou přijatelné, měla by aplikace použít generátor sekvencí s možností NOCACHE nebo použít svůj vlastní mechanismus pro generování hodnot klíčů.

Opětovné použití hodnot – Pro danou vlastnost identity se specifickým počátečním/přírůstkem nejsou hodnoty identity znovu použity modulem. Pokud konkrétní příkaz insert selže nebo pokud je příkaz insert vrácen zpět, budou spotřebované hodnoty identity ztraceny a nebudou znovu generovány. To může mít za následek mezery při generování následných hodnot identity.

Také

Pokud pro tabulku s častými mazáními existuje sloupec identity, mohou se mezi hodnotami identity objevit mezery. Pokud se jedná o problém, nepoužívejte vlastnost IDENTITY. Abyste se však ujistili, že nebyly vytvořeny žádné mezery, nebo abyste zaplnili existující mezeru , vyhodnoťte stávající hodnoty identity, než je explicitně zadáte pomocí SET IDENTITY_INSERT ON .

Zkontrolujte také vlastnosti sloupce identity a zkontrolujte hodnotu přírůstku identity. Mělo by to být 1.



  1. Dopad události query_post_execution_showplan Extended v SQL Server 2012

  2. Použijte @@ IDENTITY k vrácení poslední vložené hodnoty identity na serveru SQL Server

  3. Jak nastavíte propojený server s databází Oracle na SQL 2000/2005?

  4. Escape znak v SQL Server