Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que há lacunas nos valores da minha coluna IDENTITY?


A propriedade identity em uma coluna não garante o seguinte :

Singularidade do valor – A exclusividade deve ser imposta usando uma restrição PRIMARY KEY ou UNIQUE ou um índice UNIQUE.

Valores consecutivos em uma transação – Uma transação que insere várias linhas não tem garantia de obter valores consecutivos para as linhas porque outras inserções simultâneas podem ocorrer na tabela. Se os valores devem ser consecutivos, a transação deve usar um bloqueio exclusivo na tabela ou usar o nível de isolamento SERIALIZABLE.

Valores consecutivos após a reinicialização do servidor ou outras falhas –O SQL Server pode armazenar em cache valores de identidade por motivos de desempenho e alguns dos valores atribuídos podem ser perdidos durante uma falha de banco de dados ou reinicialização do servidor. Isso pode resultar em lacunas no valor de identidade na inserção. Se as lacunas não forem aceitáveis, o aplicativo deve usar um gerador de sequência com a opção NOCACHE ou usar seu próprio mecanismo para gerar valores de chave.

Reutilização de valores – Para uma determinada propriedade de identidade com semente/incremento específico, os valores de identidade não são reutilizados pelo mecanismo. Se uma instrução de inserção específica falhar ou se a instrução de inserção for revertida, os valores de identidade consumidos serão perdidos e não serão gerados novamente. Isso pode resultar em lacunas quando os valores de identidade subsequentes são gerados.

Além disso,

Se existir uma coluna de identidade para uma tabela com exclusões frequentes, podem ocorrer lacunas entre os valores de identidade. Se isso for uma preocupação, não use a propriedade IDENTITY. No entanto, para garantir que nenhuma lacuna foi criada ou para preencher uma lacuna existente , avalie os valores de identidade existentes antes de inserir explicitamente um com SET IDENTITY_INSERT ON .

Além disso, verifique as propriedades da coluna de identidade e verifique o valor do incremento de identidade. Deve ser 1.