Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché ci sono delle lacune nei valori della mia colonna IDENTITY?

La proprietà identity su una colonna non garantisce quanto segue :

Unicità del valore – L'unicità deve essere applicata utilizzando una CHIAVE PRIMARIA o un vincolo UNIQUE o un indice UNIQUE.

Valori consecutivi all'interno di una transazione – Non è garantito che una transazione che inserisce più righe ottenga valori consecutivi per le righe poiché nella tabella potrebbero verificarsi altri inserimenti simultanei. Se i valori devono essere consecutivi, la transazione deve utilizzare un blocco esclusivo sulla tabella o utilizzare il livello di isolamento SERIALIZABLE.

Valori consecutivi dopo il riavvio del server o altri errori –SQL Server potrebbe memorizzare nella cache i valori di identità per motivi di prestazioni e alcuni dei valori assegnati possono andare persi durante un errore del database o il riavvio del server. Ciò può causare lacune nel valore di identità al momento dell'inserimento. Se le lacune non sono accettabili, l'applicazione deve utilizzare un generatore di sequenze con l'opzione NOCACHE o utilizzare il proprio meccanismo per generare valori chiave.

Riutilizzo dei valori – Per una determinata proprietà di identità con seme/incremento specifico, i valori di identità non vengono riutilizzati dal motore. Se una particolare istruzione di inserimento non riesce o se viene eseguito il rollback dell'istruzione di inserimento, i valori di identità consumati vengono persi e non verranno generati nuovamente. Ciò può causare lacune quando vengono generati i successivi valori di identità.

Inoltre,

Se esiste una colonna di identità per una tabella con eliminazioni frequenti, possono verificarsi degli intervalli tra i valori di identità. Se questo è un problema, non utilizzare la proprietà IDENTITY. Tuttavia, per assicurarti che non siano state create lacune o per colmare una lacuna esistente , valutare i valori di identità esistenti prima di inserirne uno esplicitamente con SET IDENTITY_INSERT ON .

Inoltre, controlla le proprietà della colonna identità e controlla il valore Incremento identità. Dovrebbe essere 1.