Eu tenho um banco de dados MS SQL 2005 com uma tabela Test
com coluna ID
. ID
é uma coluna de identidade.
Eu tenho linhas nesta tabela e todas elas têm seu valor incrementado automaticamente de ID correspondente.
Agora eu gostaria de alterar todos os IDs nesta tabela assim:
ID = ID + 1
Mas quando faço isso, recebo um erro:
Não é possível atualizar a coluna de identidade 'ID'.
Eu tentei isso:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Mas isso não resolve o problema.
Eu preciso ter a identidade definida para esta coluna, mas também preciso alterar os valores de tempos em tempos. Então, minha pergunta é como realizar essa tarefa.
sql-server
sql-server-2005
tsql
identity
sql-server-2005-express
Tomasz Smykowski
fonte
fonte
#temp
tabela que você soltar é outra etapa, você não contou aqui.IDENTITY
os valores da coluna são imutáveis.No entanto, é possível alternar os metadados da tabela para remover a
IDENTITY
propriedade, fazer a atualização e voltar.Assumindo a seguinte estrutura
Então você pode fazer
No SQL Server 2012, é possível ter uma coluna de incremento automático que também pode ser atualizada de maneira mais direta com
SEQUENCES
fonte
Por meio da interface do usuário no gerenciador do SQL Server 2005, altere a coluna e remova a propriedade de número automático (identidade) da coluna (selecione a tabela clicando com o botão direito do mouse nela e escolha "Design").
Em seguida, execute sua consulta:
Em seguida, vá e adicione a propriedade autonumber novamente à coluna.
fonte
Id
Auto Identidade valores fora por 1.Em primeiro lugar, a configuração de IDENTITY_INSERT, ativada ou desativada, não funcionará para o que você precisa (é usada para inserir novos valores, como preencher lacunas).
Fazer a operação através da GUI apenas cria uma tabela temporária, copia todos os dados para uma nova tabela sem um campo de identidade e renomeia a tabela.
fonte
Isso pode ser feito usando uma tabela temporária.
A ideia
Consultas SQL
Digamos que sua
test
tabela tenha duas colunas adicionais (column2
ecolumn3
) e que existem 2 tabelas com referências de chaves estrangeirastest
chamadasforeign_table1
eforeign_table2
(porque os problemas da vida real nunca são simples).É isso aí.
fonte
DBCC CHECKIDENT ('databasename.dbo.orders', RESEED, 999), você pode alterar qualquer número de coluna de identidade com esse comando e também pode iniciar esse número de campo de qualquer número que desejar. Por exemplo, no meu comando, peço para começar de 1000 (999 + 1) espero que seja o suficiente ... boa sorte
fonte
Se a coluna não for um PK, você sempre poderá criar uma coluna NOVA na tabela com os números incrementados, solte o original e altere o novo para o antigo.
curioso para saber por que você pode precisar fazer isso ... o máximo que eu já tive que mexer nas colunas Identity foi preencher números e acabei usando o DBCC CHECKIDENT (nome da tabela, RESEED, newnextnumber)
boa sorte!
fonte
A modificação da identidade pode falhar, dependendo de vários fatores, principalmente em torno dos objetos / relacionamentos vinculados à coluna do ID. Parece que o design do banco de dados é um problema aqui, já que os IDs raramente devem mudar (tenho certeza de que você tem seus motivos e está cascasando as alterações). Se você realmente precisar alterar os IDs de tempos em tempos, sugiro criar uma nova coluna de ID fictícia que não seja a chave primária / número automático que você pode gerenciar por conta própria e gerar a partir dos valores atuais. Como alternativa, a ideia de Chrisotphers acima seria minha outra sugestão se você estiver com problemas para permitir a inserção de identidade.
Boa sorte
PS: não está falhando porque a ordem sequencial em que está executando está tentando atualizar um valor na lista para um item que já existe na lista de IDs. segurando os canudos, talvez adicione o número de linhas + 1; se isso funcionar, subtraia o número de linhas: -S
fonte
Se você precisar alterar os IDs ocasionalmente, provavelmente é melhor não usar uma coluna de identidade. No passado, implementamos os campos de numeração automática manualmente usando uma tabela 'Contadores' que rastreia o próximo ID para cada tabela. No IIRC, fizemos isso porque as colunas de identidade estavam causando corrupção no banco de dados no SQL2000, mas a possibilidade de alterar os IDs era ocasionalmente útil para teste.
fonte
Você pode inserir novas linhas com valores modificados e excluir linhas antigas. O exemplo a seguir altera o ID para ser o mesmo da chave estrangeira PersonId
fonte
Primeiro salve todos os IDs e altere-os programaticamente para os valores desejados, depois remova-os do banco de dados e insira-os novamente usando algo semelhante:
Para pastilhas em massa, use:
Dados de amostra de file.csv:
Se você não
identity_insert
desativar, você receberá o seguinte erro:fonte
Eu vi um bom artigo que me ajudou no último momento. Eu estava tentando inserir algumas linhas em uma tabela que tinha coluna de identidade, mas fez isso de forma errada e teve que excluir novamente. Depois de excluir as linhas, minha coluna de identidade foi alterada. Eu estava tentando encontrar uma maneira de atualizar a coluna que foi inserida, mas - sem sorte. Então, enquanto pesquisava no google encontrei um link ..
http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- i-update-the-value-of-an.aspx
fonte
Pergunta muito boa, primeiro precisamos no IDENTITY_INSERT para a tabela específica, depois executar a consulta de inserção (deve especificar o nome da coluna).
Nota: Depois de editar a coluna de identidade, não esqueça de desativar o IDENTITY_INSERT. Se você não tiver concluído, não poderá editar a coluna de identidade para nenhuma outra tabela.
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
fonte