Temos uma tabela de 5 GB (quase 500 milhões de linhas) e queremos remover a propriedade de identidade em uma das colunas, mas quando tentamos fazer isso através do SSMS, o tempo limite é excedido.
Isso pode ser feito através do T-SQL?
sql
sql-server
tsql
Conrad Jagger
fonte
fonte
Respostas:
Você não pode remover uma
IDENTITY
especificação depois de definida.Para remover a coluna inteira:
Informações sobre ALTER TABLE aqui
Se você precisar manter os dados, mas remover a
IDENTITY
coluna, precisará:IDENTITY
coluna existente para a nova colunaIDENTITY
coluna existente .fonte
identity
coluna for usada como parte de umaforeign key
em outra tabela, você terá que eliminar as restrições primeiro e depois agir como o @AdamWenger mencionou sobre a remoção da identidade.attribute/property
Você também pode consultar este link para obter mais detalhes sobre como remover apenas o atributo: blog.sqlauthority.com/2009/05/03/… .. Boa sorte!Se você quiser fazer isso sem adicionar e preencher uma nova coluna , sem reordenar as colunas e com quase nenhum tempo de inatividade porque nenhum dado está sendo alterado na tabela, vamos fazer alguma mágica com a funcionalidade de particionamento (mas como nenhuma partição é usada, você não não precisa da edição Enterprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
para renomear os vários objetos de esquema de volta aos nomes originais e, em seguida, você pode recriar suas chaves estrangeiras.Por exemplo, dado:
Você pode fazer o seguinte:
fonte
Isso fica confuso com restrições de chave estrangeira e primária, então, aqui estão alguns scripts para ajudá-lo no seu caminho:
Primeiro, crie uma coluna duplicada com um nome temporário:
Em seguida, obtenha o nome da sua restrição de chave primária:
Agora tente descartar a restrição de chave primária para sua coluna:
Se você tiver chaves estrangeiras, ela falhará; portanto, caso contrário, elimine as restrições de chave estrangeira. MANTENHA A TRILHA DE QUADROS QUE VOCÊ EXECUTA ASSIM PARA QUE PODE ADICIONAR AS RESTRIÇÕES MAIS TARDE !!!
Depois que todas as suas restrições de chave estrangeira forem removidas, você poderá remover a restrição PK, soltar essa coluna, renomear sua coluna temporária e adicionar a restrição PK a essa coluna:
Por fim, adicione as restrições FK novamente em:
El Fin!
fonte
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
Eu apenas tive esse mesmo problema. 4 instruções no SSMS em vez de usar a GUI e foi muito rápido.
Faça uma nova coluna
alter table users add newusernum int;
Copiar valores acima
update users set newusernum=usernum;
Solte a coluna antiga
alter table users drop column usernum;
Renomeie a nova coluna para o nome da coluna antiga
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
fonte
O script a seguir remove o campo Identidade de uma coluna chamada 'Id'
Espero que ajude.
fonte
Abaixo o código está funcionando bem quando não sabemos o nome da coluna de identidade .
Precisa copiar dados para uma nova tabela temporária como
Invoice_DELETED
. e da próxima vez que usarmos:Para obter mais explicações, consulte: https://dba.stackexchange.com/a/138345/101038
fonte
No entanto, o código acima funciona apenas se nenhuma relação de chave estrangeira primária
fonte
Apenas para alguém que tem o mesmo problema que eu. Se você quiser apenas inserir algumas vezes, pode fazer algo assim.
Vamos supor que você tenha uma tabela com duas colunas
e deseja inserir uma linha com o ID = 4. Então você aumentou para 3 para que o próximo seja 4
Faça a inserção
E retorne sua semente ao ID mais alto, suponha que seja 15
Feito!
fonte
Eu tinha o mesmo requisito, e você pode tentar dessa maneira, que eu pessoalmente recomendo, por favor, projete manualmente sua tabela e gere o script, e o que fiz abaixo foi renomear a tabela antiga e também sua restrição para backup.
fonte
No SQL Server, você pode ativar e desativar a inserção de identidade da seguinte maneira:
DEFINIR IDENTITY_INSERT table_name ON
- faça suas consultas aqui
DEFINIR IDENTITY_INSERT table_name OFF
fonte