Você não pode alterar as colunas existentes para identidade.
Você tem 2 opções,
Crie uma nova tabela com identidade e solte a tabela existente
Crie uma nova coluna com identidade e solte a coluna existente
Abordagem 1. ( Nova tabela ) Aqui você pode reter os valores de dados existentes na coluna de identidade recém-criada.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Abordagem 2 ( Nova coluna ) Você não pode reter os valores de dados existentes na coluna de identidade recém-criada. A coluna de identidade manterá a sequência do número.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Consulte a seguinte publicação no Fórum do Microsoft SQL Server para obter mais detalhes:
Como alterar a coluna para identidade (1,1)
IDENTITY(1, 1)
parte com a chave primária de colunaNo SQL 2005 e acima, há um truque para resolver esse problema sem alterar as páginas de dados da tabela. Isso é importante para tabelas grandes em que tocar em todas as páginas de dados pode levar minutos ou horas. O truque também funciona mesmo que a coluna de identidade seja uma chave primária, faça parte de um índice em cluster ou não em cluster ou outras dicas que podem desencadear a solução mais simples de "adicionar / remover / renomear coluna".
Aqui está o truque: você pode usar o ALTER TABLE ... do SQL Server para alterar o esquema de uma tabela sem alterar os dados, o que significa que você pode substituir uma tabela por uma IDENTITY por um esquema de tabela idêntico, mas sem uma coluna IDENTITY. O mesmo truque funciona para adicionar IDENTITY a uma coluna existente.
Normalmente, ALTER TABLE ... SWITCH é usado para substituir eficientemente uma partição completa em uma tabela particionada por uma nova partição vazia. Mas também pode ser usado em tabelas não particionadas.
Usei esse truque para converter, em menos de 5 segundos, uma coluna de uma tabela de linhas de 2,5 bilhões de IDENTITY para uma não-IDENTITY (para executar uma consulta de várias horas cujo plano de consulta funcionou melhor para não-IDENTITY colunas) e, em seguida, restaurou a configuração IDENTITY, novamente em menos de 5 segundos.
Aqui está um exemplo de código de como ele funciona.
Obviamente, isso está mais envolvido do que as soluções de outras respostas, mas se sua mesa for grande, isso pode salvar a vida de verdade. Existem algumas advertências:
Há um bom artigo no TechNet detalhando os requisitos acima.
ATUALIZAÇÃO - Eric Wu fez um comentário abaixo que adiciona informações importantes sobre esta solução. Copie-o aqui para garantir mais atenção:
Se a tabela estiver ativamente sendo estendida com novas linhas (o que significa que você não tem muito tempo de inatividade entre adicionar IDENTITY e adicionar novas linhas, em vez de
DBCC CHECKIDENT
querer definir manualmente o valor de propagação de identidade no novo esquema da tabela a ser maior que o maior ID existente na tabela, por exemplo,IDENTITY (2435457, 1)
você pode incluir a transaçãoALTER TABLE...SWITCH
e aDBCC CHECKIDENT
transação (ou não - não testou isso), mas parece que definir o valor da semente manualmente será mais fácil e seguro.Obviamente, se nenhuma nova linha estiver sendo adicionada à tabela (ou apenas adicionada ocasionalmente, como um processo diário de ETL), essa condição de corrida não acontecerá, então tudo
DBCC CHECKIDENT
bem.fonte
DBCC CHECKIDENT('<newTableName>')
imediatamente após a troca. Consulte msdn.microsoft.com/en-us/library/ms176057.aspx para obter mais informações.Você não pode alterar uma coluna para ser uma coluna IDENTITY. O que você precisará fazer é criar uma nova coluna, definida como uma IDENTIDADE desde o início, soltar a coluna antiga e renomear a nova para o nome antigo.
Marc
fonte
Há uma solução legal descrita aqui: SQL SERVER - Adicionar ou remover propriedade de identidade na coluna
Em resumo, edite manualmente sua tabela no SQL Manager, alterne a identidade, NÃO SALVE alterações, apenas mostre o script que será criado para as alterações, copie-o e use-o mais tarde.
Isso economiza muito tempo, porque (o script) contém todas as chaves estrangeiras, índices etc. relacionados à tabela que você altera. Escrevendo isso manualmente ... Deus não permita.
fonte
Considere usar SEQUENCE em vez de IDENTITY .
No sql server 2014 (não sei sobre versões inferiores), você pode fazer isso simplesmente, usando a sequência.
A partir daqui: Sequência como valor padrão para uma coluna
fonte
Explicação simples
Renomeie a coluna existente usando sp_RENAME
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Exemplo para renomear:
A coluna existente UserID é renomeada como OldUserID
Em seguida, adicione uma nova coluna usando alter query para definir como chave primária e valor de identidade
Exemplo para Definir chave primária
O novo nome da coluna criada é UserID
Solte a coluna renomeada
Exemplo de coluna renomeada Drop
Agora, adicionamos uma chave primária e identidade à coluna existente na tabela.
fonte
Eu sou um desenvolvedor java que, por acaso, entrou em uma equipe sem um DBA e onde, como desenvolvedor, não posso obter direitos de DBA. Fui encarregado de mover um esquema inteiro entre dois bancos de dados; portanto, sem ter um DBA, tive que fazê-lo executando scripts, não podendo usar a GUI no SQL Server 2008 porque não tinha privilégios de administrador.
Tudo foi movido sem problemas, no entanto, ao executar um procedimento armazenado no novo schema.table, descobri que perdi o campo de identidade em uma tabela. Verifiquei novamente o script que criou a tabela e ele estava lá, no entanto, o SQL Server não o obteve quando executei o script. Mais tarde, fui informado por um DBA que ele já havia visto esse mesmo problema antes.
De qualquer forma, para o SQL Server 2008, estas são as etapas que tomei para resolver isso e funcionaram, por isso estou postando isso aqui na esperança de que seja uma ajuda para alguém. Isto é o que eu fiz, pois tinha dependências do FK em outra tabela que tornava isso mais difícil:
Eu usei essa consulta para verificar se a identidade estava realmente ausente e para visualizar dependências na tabela.
1.) Encontre estatísticas em uma tabela:
2.) Crie uma nova tabela idêntica e duplicada, exceto adicione um campo de identidade no campo PK onde estava antes.
3.) Desative a identidade para mover dados.
4.) Transfira os dados.
5.) Verifique se os dados estão lá.
6.) Reative a identidade.
7.) Este é o melhor script que encontrei para obter todos os relacionamentos do FK para verificar quais tabelas a tabela original faz referência como dependências e me deparei com muitas, por isso é um guardião!
8.) Verifique se você possui todos os scripts PK e FK para todas as tabelas envolvidas, antes desta próxima etapa.
9.) Você pode clicar com o botão direito do mouse em cada chave e criar um script usando o SQL Server 2008
10.) Solte o FK (s) da (s) tabela (s) de dependência usando esta sintaxe:
11.) Solte a tabela original:
13.) Essas próximas etapas dependem dos scripts que você criou no SQL Server 2008 na etapa 9.
--Adicione o PK à nova tabela.
--Adicione o FK à nova tabela.
--Adicione os FKs de volta à tabela de dependência.
14.) Verifique se tudo está correto e completo. Eu usei a GUI para olhar as tabelas.
15.) Renomeie a nova tabela com o nome da tabela original.
Finalmente, tudo funcionou!
fonte
você não pode fazê-lo dessa maneira, é necessário adicionar outra coluna, soltar a coluna original e renomear a nova coluna ou criar uma nova tabela, copiar os dados e soltar a tabela antiga e renomear a nova tabela para a antiga. mesa
se você usa o SSMS e define a propriedade de identidade como ON no designer, aqui está o que o SQL Server faz nos bastidores. Portanto, se você tiver uma tabela chamada [user], é isso que acontece se você criar UserID e identidade
Dito isto, existe uma maneira de hackear a tabela do sistema para realizá-la, definindo o valor bit a bit, mas isso não é suportado e eu não faria isso
fonte
Como eu entendi em casos normais, estamos criando uma tabela com Chave primária que está tendo a propriedade Identity.
Portanto, Renomear ou Excluir uma coluna associada à restrição de Chave primária não será possível porque as Regras de restrição estão validando a estrutura da coluna. Para conseguir isso, precisamos processar algumas etapas da seguinte maneira: Vamos assumir TableName = 'Employee' e ColumnName = 'EmployeeId' 1. Adicione uma nova coluna 'EmployeeId_new' na tabela 'Employee' ALTER TABLE Employee ADD EmployeeId_new INT IDENTITY ( 1,1)
Agora remova a coluna 'EmployeeId' da tabela 'Employee'
ALTER TABLE Employee DROP COLUMN EmployeeId
Isso gerará erro devido às regras de restrição de chave primária serem aplicáveis e à validação da estrutura da coluna.
* ### ' Msg 5074, Nível 16, Estado 1, Linha 1 O objeto [PK_dbo.Employee] depende da colmn [EmployeeId].' ###
Portanto, temos que remover primeiro a restrição de chave primária da tabela 'Employee', para remover a coluna
Restrição ALTER TABLE Employee DROP [PK_dbo.Employee]
Agora podemos remover a coluna 'EmployeeId' da tabela 'Employee', como ocorreu na etapa anterior, onde ocorreu o erro
ALTER TABLE Employee DROP COLUMN EmployeeId
Agora a coluna 'EmployeeId' foi removida da tabela. Renomearemos a nova coluna recém-adicionada 'EmployeeId_new' com 'EmployeeId'
sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'
Para reorganizar a tabela da mesma forma que era, precisamos adicionar a restrição de chave primária para a coluna 'EmployeeId'
ALTER TABLE Employee adicionar restrição [PK_dbo.Employee] chave primária (EmployeeId)
8. Agora a tabela 'Employee' com 'EmployeeId' é modificada para regras de identidade junto com a restrição de chave primária existente
fonte
Por design, não há uma maneira simples de ativar ou desativar o recurso de identidade de uma coluna existente. A única maneira limpa de fazer isso é criar uma nova coluna e torná-la uma coluna de identidade ou criar uma nova tabela e migrar seus dados.
Se usarmos o SQL Server Management Studio para se livrar do valor da identidade na coluna "id", uma nova tabela temporária será criada, os dados serão movidos para a tabela temporária, a tabela antiga será descartada e a nova tabela será renomeada.
Use o Management Studio para fazer a alteração e clique com o botão direito do mouse no designer e selecione "Gerar script de alteração".
Você verá que é isso que o SQL Server está fazendo em segundo plano.
fonte
Infelizmente não há um; a propriedade IDENTITY pertence à tabela e não à coluna.
A maneira mais fácil é fazer isso na GUI, mas se isso não for uma opção, você pode percorrer um longo caminho ao copiar os dados, soltar a coluna, adicioná-los novamente com identidade e colocar os dados de volta.
Veja aqui uma conta golpe por golpe.
fonte
Clique com o botão direito do mouse no nome da tabela no Pesquisador de Objetos. Você receberá algumas opções. Clique em 'Design'. Uma nova guia será aberta para esta tabela. Você pode adicionar restrição de identidade aqui em 'Propriedades da coluna'.
fonte
Para modificar as propriedades de identidade de uma coluna:
É isso aí, e funcionou para mim
fonte
Se você estiver usando o Visual Studio 2017+
Isso fará tudo por você.
fonte
Se o pôster original estava realmente querendo definir uma coluna existente para ser a
PRIMARY KEY
da tabela e, na verdade, não precisava que a coluna fosse umaIDENTITY
coluna (duas coisas diferentes), isso pode ser feito via t-SQL com:Observe os parênteses ao redor do nome da coluna após a
PRIMARY KEY
opção.Embora esta publicação seja antiga e eu suponha que os solicitantes precisam, achei que essas informações adicionais poderiam ser úteis para os usuários que encontrarem esse segmento, pois acredito que a conversa possa levar a pessoa a acreditar que uma coluna existente não pode ser configurada como chave primária sem adicioná-la como uma nova coluna primeiro, o que estaria incorreto.
fonte
De acordo com minha condição atual, sigo essa abordagem. Quero dar identidade a uma tabela principal após os dados inseridos via script.
Como eu quero acrescentar uma identidade, ela sempre começa de 1 a Fim da contagem de registros que eu quero.
Isso criará a mesma coluna de chave primária com identidade
Eu usei esses links: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Adicionar chave primária à tabela existente
fonte
Não acredito que você possa alterar uma coluna existente para ser uma coluna de identidade usando o tsql. No entanto, você pode fazê-lo através da visualização de design do Enterprise Manager.
Como alternativa, você pode criar uma nova linha como a coluna de identidade, soltar a coluna antiga e renomear sua nova coluna.
fonte
Basicamente, existem quatro etapas lógicas.
Crie uma nova coluna de identidade. Ative Inserir identidade para esta nova coluna.
Insira os dados da coluna de origem (a coluna que você deseja converter em identidade) nessa nova coluna.
Desative a Inserir identidade para a nova coluna.
Solte sua coluna de origem e renomeie a nova coluna para o nome da coluna de origem.
Pode haver mais complexidade, como trabalhar em vários servidores, etc.
Consulte o seguinte artigo para as etapas (usando ssms e T-sql). Essas etapas são destinadas a iniciantes com menos domínio do T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
fonte
gera um script para todas as tabelas com chave primária = bigint que não possuem um conjunto de identidades; isso retornará uma lista de scripts gerados com cada tabela;
fonte