Reposicionando valores de campos identity

por Reydeval Rocha

 

 

Olá pessoal! Feliz Ano Novo! Desejo um 2007 como muita saúde e muito código pra todo mundo! Hoje trataremos de um assunto que vez por outra precisamos ter contato. Como reposicionar os valores de um campo identity. Vamos começar os trabalhos.

 

 

Como reposicionar um campo identity

 

Há situações em que desejamos reposicionar o valor de um campo identity. Por exemplo, suponha que inserimos três registros numa tabela cuja chave primária seja um campo identity. Após as inserções, excluímos o registro com o campo código de valor 3 (valor da chave primária). Se agora inserirmos outro registro, o valor 3 não será mais aproveitado. O valor do campo código "pulará" para o valor 4. Como fazer  para voltarmos ao valor 3?

 

Vejamos o cenário abaixo:

 

--Criando a tabela tb_tabela

create table tb_tabela (      codigo          integer          identity,

                                      nome            varchar(100),

                                      sobrenome     varchar(100))

go

 

alter table tb_tabela add constraint pk_tabela primary key(codigo)

go

 

 

--Realizando os inserts

insert into tb_tabela (nome,sobrenome)

  values ('Pedro','Rocha')

 

insert into tb_tabela (nome,sobrenome)

  values ('Sandra','Rocha')

 

insert into tb_tabela (nome,sobrenome)

  values ('Reydeval','Rocha')

 

Vejamos os dados inseridos

 

select * from tb_tabela

 

Os registros são inseridos na seqüência 1, 2 e 3 (valores do campo código)


19-01-07pic01.JPG

Figura 1.0 – Visualizando dados inseridos. Valores identity em seqüência

 

Excluiremos o último registro da tb_tabela.

 

--Excluindo o último registro

delete tb_tabela

 where codigo = 3

 

Vamos inserir novamente o registro anterior

 

--Inserindo novamente o registro

insert into tb_tabela (nome,sobrenome)

  values ('Reydeval','Rocha')

 

Vejamos como ficaram os dados agora.

 

select * from tb_tabela

 

19-01-07pic02.JPG

Figura 2.0 – Visualizando dados inseridos. Valores identity fora de seqüência

 

Observem que o registro inserido assumiu o valor 4 para o campo código. Isso ocorre mesmo que o valor 3 não esteja sendo usado. Este é o comportamento normal para um campo identity que mantém um contador indicando o último valor usado. Percebe-se que caso haja muita atividade numa dada tabela, com inserts e deletes freqüentes, haverá "buracos" nos valores do campo identity.

 

Para solucionar esse inconveniente podemos utilizar o comando DBCC CHECKIDENT. Através dele podemos rearrumar a contagem do campo e posicionar o contador realmente no último valor usado. Deve-se ter atenção nesse ponto. Ao reposicionarmos o contador do identity devemos colocá-lo no último valor utilizado. Assim definimos qual é o próximo valor que será utilizado.

 

Iremos excluir novamente o último registro, da tb_tabela, que agora possui o valor 4. Em seguida reposicionaremos o valor do campo código para 2 usando o comando DBCC CHECKIDENT.

 

--Excluindo o último registro

delete tb_tabela

 where codigo = 4

 

 

--Reposicionando o valor do campo identity para 2

DBCC CHECKIDENT ('tb_tabela',reseed,2)

 

 

--Inserindo novamente o registro

insert into tb_tabela (nome,sobrenome)

  values ('Reydeval','Rocha')

 

 

Se verificarmos os dados inseridos na tb_tabela, notaremos que os registros estão novamente em seqüência.

 

select * from tb_tabela

 

 19-01-07pic01.JPG
Figura 3.0 – Visualizando dados inseridos. Valores identity  novamente em seqüência

 

Conclusão

 

Apresentamos uma solução para o reposicionamento dos valores de um campo identity. Esse procedimento objetiva evitar os “buracos” deixados na tabela contendo um campo identity quando há muita atividade subjacente (inserts e deletes).

 

É importante ressaltar que o procedimento apresentado deve ser usado com cautela quando a tabela afetada possuir registros filhos em uma outra tabela, ou seja, quando a mesma for referenciada pela foreign key de uma outra tabela. Até o próximo artigo.