Excluí alguns registros de uma tabela em um banco de dados do SQL Server. Agora, os IDs vão de 101 a 1200. Quero excluir os registros novamente, mas quero que os IDs voltem para 102. Existe uma maneira de fazer isso no SQL Server?
Excluí alguns registros de uma tabela em um banco de dados do SQL Server. Agora, os IDs vão de 101 a 1200. Quero excluir os registros novamente, mas quero que os IDs voltem para 102. Existe uma maneira de fazer isso no SQL Server?
Respostas:
Emita o seguinte comando para replanejar mytable para iniciar em 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Leia sobre isso nos Livros on-line (ajuda do BOL, SQL). Também tenha cuidado para não ter registros maiores do que a semente que está configurando.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
se número = 0, na próxima inserção, o campo de incremento automático conterá o valor 1
se número = 101, na próxima inserção, o campo de incremento automático conterá o valor 102
Algumas informações adicionais ... Pode ser útil para você
Antes de fornecer o incremento automático number
na consulta acima, você deve garantir que a coluna de incremento automático da tabela existente contenha valores menores que isso number
.
Para obter o valor máximo de uma coluna (nome_da_coluna) de uma tabela (tabela1), você pode usar a seguinte consulta
SELECT MAX(column_name) FROM table1
semi à prova de idiotas:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
Se você estiver usando o MySQL, tente o seguinte:
ALTER TABLE tablename AUTO_INCREMENT = 1
Exclua e recompense todas as tabelas em um banco de dados.
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
Com base na resposta aceita, para aqueles que encontraram um problema semelhante, com qualificação completa do esquema:
( [MyDataBase].[MySchemaName].[MyTable]
) ... resulta em um erro, você precisa estar no contexto desse banco de dados
Ou seja, o seguinte gerará um erro:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Coloque o nome completo da tabela com aspas simples:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Várias respostas recomendam o uso de uma declaração como esta:
DBCC CHECKIDENT (mytable, RESEED, 0)
Mas o OP disse que "excluiu alguns registros", que podem não ser todos, portanto, um valor de 0 nem sempre é o correto. Outra resposta sugeriu encontrar automaticamente o valor atual máximo e reenviar para esse, mas isso pode causar problemas se não houver registros na tabela e, portanto, max () retornará NULL. Um comentário sugerido usando simplesmente
DBCC CHECKIDENT (mytable)
redefinir o valor, mas outro comentário afirmou corretamente que isso apenas aumenta o valor para o máximo já existente na tabela; isso não reduzirá o valor se ele já for maior que o máximo da tabela, que é o que o OP queria fazer.
Uma solução melhor combina essas idéias. O primeiro CHECKIDENT redefine o valor para 0 e o segundo o redefine para o valor mais alto atualmente na tabela, caso haja registros na tabela:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Como vários comentários indicaram, verifique se não há chaves estrangeiras em outras tabelas apontando para os registros excluídos. Caso contrário, essas chaves estrangeiras apontarão para os registros criados após a nova propagação da tabela, o que quase certamente não é o que você tinha em mente.
Quero adicionar esta resposta porque a DBCC CHECKIDENT
abordagem-produzirá problemas quando você usar esquemas para tabelas. Use isto para ter certeza:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Se você deseja verificar o sucesso da operação, use
SELECT IDENT_CURRENT(@Table);
que deve aparecer 0
no exemplo acima.
Você não deseja fazer isso em geral. Reseed pode criar problemas de integridade de dados. É realmente apenas para uso em sistemas de desenvolvimento em que você está limpando todos os dados de teste e iniciando novamente. Ele não deve ser usado em um sistema de produção, caso todos os registros relacionados não tenham sido excluídos (nem todas as tabelas que deveriam estar em um relacionamento de chave estrangeira são!). Você pode criar uma bagunça fazendo isso e, especialmente, se quiser fazê-lo regularmente após cada exclusão. É uma má idéia se preocupar com lacunas nos valores dos campos de identidade.
Que tal isso?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
Essa é uma maneira rápida e simples de alterar o incremento automático para 0 ou o número que você desejar. Eu descobri isso exportando um banco de dados e lendo o código pessoalmente.
Você também pode escrevê-lo assim para torná-lo uma solução de linha única:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;