Published on

May 29, 2017

Adicionando uma Coluna de Identidade a uma Tabela Grande no SQL Server

Você já se deparou com uma situação em que precisou adicionar uma coluna de identidade a uma tabela grande no SQL Server? Pode ser uma tarefa desafiadora, especialmente ao lidar com tabelas que possuem milhões de linhas e sem chave primária. Neste post do blog, exploraremos uma solução para esse problema.

Vamos supor que você tenha uma tabela realmente grande com vários milhões de linhas e, de repente, perceba que precisa ter uma chave primária. A solução mais fácil seria criar uma nova coluna int com uma propriedade de identidade, certo? Infelizmente, nesse caso, adicionar uma coluna de identidade a uma tabela tão grande pode causar um crescimento significativo no log.

Então, o que você pode fazer nesse cenário? Uma abordagem seria adicionar uma coluna int, preenchê-la em partes e, em seguida, torná-la uma coluna de identidade. No entanto, você pode ficar desapontado ao descobrir que não pode adicionar diretamente a propriedade de identidade a uma coluna existente.

Vamos dar uma olhada em um exemplo:

CREATE TABLE IdentAdd (Col1 char(10), ID INT NOT NULL);
GO
ALTER TABLE IdentAdd ALTER COLUMN ID INT NOT NULL IDENTITY(1,1);
GO

A execução do código acima resultará em uma mensagem de erro: “Erro de sintaxe próximo à palavra-chave ‘IDENTITY'”.

No entanto, existe uma solução alternativa que pode nos ajudar a alcançar nosso objetivo. Acontece que a propriedade de identidade não é uma daquelas coisas que precisam ser idênticas ao fazer uma troca de partição.

Aqui está como você pode adicionar uma coluna de identidade a uma tabela grande:

-- Adicione alguns dados para que possamos ver o que está acontecendo
INSERT INTO IdentAdd (Col1, ID) VALUES
('a',1),('a',2),('a',3),('a',4),('a',5),('a',6);
GO

-- Crie a tabela de troca com a coluna de identidade.
-- Certifique-se de que a semente seja o valor máximo da ID + o incremento.
CREATE TABLE IdentAddSwitch (Col1 char(10), ID INT NOT NULL IDENTITY(7,1));
GO

-- Troque as tabelas
ALTER TABLE IdentAdd SWITCH TO IdentAddSwitch;
GO

-- Exclua a tabela agora vazia
DROP TABLE IdentAdd;
GO

-- Renomeie a tabela trocada para o nome correto
EXEC sp_rename 'IdentAddSwitch','IdentAdd';
GO

-- Confirme que existem linhas e a coluna de identidade.
SELECT COUNT(1) FROM IdentAdd;
EXEC sp_help IdentAdd;
GO

No código acima, primeiro inserimos alguns dados na tabela original. Em seguida, criamos uma tabela de troca com a coluna de identidade desejada. Usamos a instrução ALTER TABLE para trocar os dados da tabela original para a tabela de troca. Por fim, excluímos a tabela original e renomeamos a tabela de troca para o nome correto.

Seguindo essas etapas, você pode adicionar com sucesso uma coluna de identidade a uma tabela grande sem experimentar um crescimento excessivo no log.

Adicionar uma coluna de identidade a uma tabela grande pode ser uma tarefa complexa, mas com a abordagem correta, é possível. Usando a técnica de troca de partição, você pode evitar as limitações de adicionar diretamente a propriedade de identidade a uma coluna existente. Essa solução alternativa permite que você gerencie eficientemente tabelas grandes e mantenha a integridade dos dados.

Obrigado por ler este post do blog. Esperamos que você tenha achado útil para resolver seus desafios no SQL Server. Fique ligado para mais artigos informativos sobre conceitos e melhores práticas do SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.