Eu inseri registros em uma tabela de banco de dados do SQL Server. A tabela tinha uma chave primária definida e a semente de identidade de incremento automático é definida como "Sim". Isso é feito principalmente porque no SQL Azure, cada tabela precisa ter uma chave primária e uma identidade definidas.
Mas como eu tenho que excluir alguns registros da tabela, a semente de identidade para essas tabelas será alterada e a coluna de índice (gerada automaticamente com um incremento de 1) será alterada.
Como posso redefinir a coluna de identidade depois de excluir os registros para que a coluna tenha sequência em ordem numérica crescente?
A coluna de identidade não é usada como chave estrangeira em nenhum lugar do banco de dados.
Respostas:
O
DBCC CHECKIDENT
comando de gerenciamento é usado para redefinir o contador de identidade. A sintaxe do comando é:Exemplo:
Não era suportado em versões anteriores do Banco de Dados SQL do Azure, mas agora é suportado.
Observe que o
new_reseed_value
argumento varia de acordo com as versões do SQL Server, de acordo com a documentação :No entanto, acho essas informações enganosas (na verdade, simplesmente erradas) porque o comportamento observado indica que pelo menos o SQL Server 2012 ainda usa new_reseed_value + a lógica atual do valor de incremento. A Microsoft até contradiz o que
Example C
encontrou na mesma página:Ainda assim, isso deixa uma opção para um comportamento diferente nas versões mais recentes do SQL Server. Acho que a única maneira de ter certeza, até a Microsoft esclarecer as coisas em sua própria documentação, é fazer testes reais antes do uso.
fonte
DBCC CHECKIDENT
há suporte para o próximo lançamento (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Embora, para essa situação em particular, eu ainda recomendo TRUNCATE TABLE :)Onde 0 é o
identity
valor inicialfonte
TRUNCATE
, o novo valor inicial deve ser o valor para o próximo uso (ou seja, 1 e não 0). Se a tabela não estiver vazia, ela usará onew_reseed_value + 1
. MSDNDELETE
, nãoTRUNCATE
, nesse caso tambémnew_reseed+value + 1
. Eu escrevi um post sobre isso, mostrando o comportamento real através de alguns testes e atualizei o documento real (agora que podemos, devido ao fato de estar no GitHub): Como o DBCC CHECKIDENT realmente funciona ao redefinir a semente de identidade (RESEED)? .Deve-se observar que, se todos os dados estiverem sendo removidos da tabela por meio da
DELETE
(ou seja, semWHERE
cláusula), desde que a) as permissões permitam eb) não houver FKs fazendo referência à tabela (que parece ser caso aqui), o usoTRUNCATE TABLE
seria preferido, pois é mais eficienteDELETE
e redefine aIDENTITY
semente ao mesmo tempo. Os seguintes detalhes são obtidos da página MSDN para TRUNCATE TABLE :Então, o seguinte:
Torna-se apenas:
Consulte a
TRUNCATE TABLE
documentação (vinculada acima) para obter informações adicionais sobre restrições, etc.fonte
Embora a maioria das respostas esteja sugerindo RESEED para 0, muitas vezes precisamos apenas reenviar para o próximo ID disponível
Isso irá verificar a tabela e redefinir para o próximo ID.
fonte
declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Eu tentei
@anil shahs
responder e redefinir a identidade. Mas quando uma nova linha foi inserida, ela recebeu oidentity = 2
. Então, em vez disso, mudei a sintaxe para:Em seguida, a primeira linha receberá a identidade = 1.
fonte
Embora a maioria das respostas estão sugerindo
RESEED
que0
, e enquanto alguns vêem isso como uma falha deTRUNCATED
tabelas, a Microsoft tem uma solução que exclui oID
Isso verificará a tabela e redefinirá para a próxima
ID
. Isso está disponível desde o MS SQL 2005 até o momento.https://msdn.microsoft.com/en-us/library/ms176057.aspx
fonte
Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.
mas após novas inserções, ela ainda está usando a semente incorreta.emitir 2 comando pode fazer o truque
o primeiro redefine a identidade para zero e o próximo define o próximo valor disponível - jacob
fonte
@jacob
Trabalhou para mim, eu apenas tinha que limpar todas as entradas primeiro da tabela e, em seguida, adicionei o item acima em um ponto de disparo após a exclusão. Agora, sempre que eu excluir uma entrada, é retirada de lá.
fonte
Truncate
A tabela é preferida porque limpa os registros, redefine o contador e recupera o espaço em disco.Delete
eCheckIdent
deve ser usado apenas onde chaves estrangeiras o impedem de truncar.fonte
Redefinir coluna de identidade com o novo ID ...
fonte
Essa é uma pergunta comum e a resposta é sempre a mesma: não faça. Os valores de identidade devem ser tratados como arbitrários e, como tal, não há ordem "correta".
fonte
Execute este script para redefinir a coluna de identidade. Você precisará fazer duas alterações. Substitua tableXYZ por qualquer tabela que você precise atualizar. Além disso, o nome da coluna de identidade precisa ser removido da tabela temporária. Isso foi instantâneo em uma tabela com 35.000 linhas e 3 colunas. Obviamente, faça backup da tabela e tente primeiro em um ambiente de teste.
fonte
Isso definirá o valor atual da identidade como 0.
Ao inserir o próximo valor, o valor da identidade é incrementado para 1.
fonte
Use este procedimento armazenado:
Apenas revisitando minha resposta. Me deparei com um comportamento estranho no sql server 2008 r2 que você deve estar ciente.
A primeira seleção produz
0, Item 1
.O segundo produz
1, Item 1
. Se você executar a redefinição logo após a criação da tabela, o próximo valor será 0. Honestamente, não estou surpreso que a Microsoft não consiga acertar essas coisas. Eu o descobri porque tenho um arquivo de script que preenche as tabelas de referência que às vezes executo após a recriação de tabelas e outras quando as tabelas já foram criadas.fonte
Eu uso o seguinte script para fazer isso. Existe apenas um cenário no qual ele produzirá um "erro", ou seja, se você excluiu todas as linhas da tabela e
IDENT_CURRENT
está atualmente definido como 1, ou seja, havia apenas uma linha na tabela para começar.fonte
Para obter linhas DELETE completas e redefinir a contagem de IDENTITY, eu uso isso (SQL Server 2008 R2)
fonte
A reposição de 0 não é muito prática, a menos que você esteja limpando a tabela como um todo.
de outro modo, a resposta dada por Anthony Raymond é perfeita. Obtenha o máximo da coluna de identidade primeiro e depois propague-o com o máx.
fonte
Eu tenho tentado fazer isso para um grande número de tabelas durante o desenvolvimento, e isso funciona como um encanto.
Portanto, você primeiro força a configuração para 1 e, em seguida, o índice mais alto das linhas presentes na tabela. Descanso rápido e fácil do idex.
fonte
É sempre melhor usar TRUNCATE quando possível, em vez de excluir todos os registros, pois ele também não usa espaço de log.
No caso de precisarmos excluir e redefinir a semente, lembre-se sempre de que, se a tabela nunca foi preenchida e você o usou
DBCC CHECKIDENT('tablenem',RESEED,0)
, o primeiro registro terá identidade = 0, conforme indicado na documentação do msdnfonte
TRUNCATE
isso impediria oROLLBACK
comportamento esperado? ROLLBACK ainda retrocede. Mesmo se o banco de dados estiver definido comoBULK_LOGGED
.Primeiro: Especificação de identidade apenas: "Não" >> Salvar projeto de execução de banco de dados
Depois disso: Especificação de identidade apenas: "SIM" >> Salvar projeto de execução de banco de dados
Seu ID do banco de dados, PK Iniciar a partir de 1 >>
fonte