Redefinir o valor de IDENTITY

16

Eu tenho uma tabela com uma coluna de identidade. Durante o desenvolvimento, excluo as linhas de tempos em tempos e as adiciono novamente. Mas os valores de IDENTITY sempre aumentaram e não começaram de 1 quando os adicionei novamente. Agora minha identificação passa de 68 -> 92 e isso trava meu código.

Como redefinir o valor de IDENTITY?

Gijs
fonte
Eu tornaria meu código mais resistente a valores de identidade ausentes. Uma coluna de identidade não garante numeração contígua, e irá , eventualmente, acontecer
Trubs

Respostas:

29

Você pode redefinir o valor da identidade

DBCC CHECKIDENT('tableName', RESEED, 0)

Portanto, da próxima vez que você inserir no TableName, o valor da identidade inserido será 1.

Quando você exclui linhas da tabela, ele não redefine o valor da Identidade, mas continua aumentando. Assim como o que aconteceu no seu caso.

Agora, quando você truncar a tabela, ele redefinirá o valor de Identidade para o valor original da Tabela.

Consulte: SQL SERVER - DELETE, TRUNCATE e RESEED Identity para obter um exemplo detalhado e uma boa explicação sobre a diferença entre Truncar e Excluir

Kin Shah
fonte
22

O Kin mostrou como você pode redefinir o valor de IDENTITY, mas fora de um ambiente de desenvolvimento quando você está realmente removendo todos os dados, por que você precisa fazer isso?

Espero que você não pretenda manter uma sequência contígua de valores de IDENTIDADE quando estiver em produção. E espero que você não esteja realmente escrevendo seu código para codificar os valores de IDENTITY. Se esses são valores de ID significativos, você deve parar de usar a propriedade IDENTITY.

Existem algumas coisas que impedirão que isso aconteça:

  • se um valor de IDENTITY for atribuído durante uma transação e a transação for revertida, o valor não será "devolvido" e o próximo valor será o que nunca será usado + 1.
  • se uma linha for excluída posteriormente, a IDENTITY nunca voltará para preencher as lacunas.
  • existe um erro ativo no SQL Server 2012 que não será corrigido até que o SQL Server 2014 nunca seja corrigido (a menos que você use um sinalizador de rastreamento não documentado e muito caro) pelo qual uma reinicialização parecerá descartar até 1000 valores da sua coluna IDENTITY . O bug no Connect sugere que isso é restrito a eventos de failover envolvendo grupos de disponibilidade, mas posso garantir que o bug é muito mais amplo que isso.

Em resumo, se você se preocupa com lacunas ou deseja atribuir um significado específico a esses valores, pare de usar IDENTITY. Solte e recrie a tabela e, quando você precisar excluir os valores e preencher novamente, execute uma atualização ou insira os valores codificados dessa coluna.

Como um aparte, chave primária e identidade não são a mesma coisa. Uma coluna de identidade não é uma chave primária, a menos que você a defina explicitamente como tal, e certamente você pode ter uma chave primária que não seja uma coluna de identidade.

Aaron Bertrand
fonte
-4

Se você precisar apenas eliminar as últimas linhas que não seguiram o valor incremental de um campo de identidade, existe uma maneira fácil e segura:

  1. primeiro exclua os últimos registros que 'saltaram'
  2. altere o tipo de dados do seu campo de identidade (de int para bigint ou vice-versa)
  3. salve a mesa
  4. adicione um novo registro e verifique se ele atribui o número do valor mais alto + 1
  5. Substitua o tipo de dados do seu campo de identidade, conforme conveniente para suas necessidades

e você está pronto.

Ramon Baiges Miro
fonte
3
"Salvar a tabela" não é uma declaração significativa para o SQL Server. A alteração dos tipos de dados pode ser trivial com menos de 100 linhas, mas pode ser muito cara para tabelas grandes.
Michael Green
2
Suponho que você queira dizer no SSMS. Isso criará uma nova tabela, copie todas as linhas para ela, solte a tabela antiga e renomeie a nova. E você precisa fazer isso duas vezes para alternar o tipo de dados de volta. Ele está usando uma marreta para quebrar uma noz.
Martin Smith