Repostagem – Utilizando Campos Identity no SQL Server
Olá a todos!
Primeiramente gostaria de dizer que este é um post para o nível iniciante, e serve como base para aquelas perguntas “como é que eu fazia aquilo mesmo?”. É baseado em um mini artigo que escrevi, e este post também já publiquei no DevBR.
Em muitas ocasiões nos deparamos com situações em que precisamos trabalhar em alguma coluna que seja identity. Este mini-artigo descreve alguns comandos úteis na manipulação destas colunas.
Criando uma tabela com campo identity: Devemos criar com o parâmetro identity, e configurar o primeiro valor, e o valor de incremento, respectivamente (IDENTITY (<inicio>,<incremento>)). Conforme no exemplo a seguir:
CREATE TABLE Tabela ( Id INT IDENTITY (1,1) PRIMARY KEY, Valor VARCHAR(50) )
Reiniciando o valor do campo identity: Algumas vezes precisamos alterar o valor do identity (para reiniciar a contagem, por exemplo). Há o comando truncate que além de limpar a tabela (entre outras coisas), também zera o valor do identity. No entanto, se o nosso objetivo é apenas trocar o valor do identity, o truncate não é uma saída interessante. Para manipular o identity podemos fazer como descrito a seguir:
Vamos imaginar que queremos que o próximo registro a ser inserido na tabela Tabela queremos que sua chave primária Id, se inicie em 1.
Para resolver esse problema, podemos usar a seguinte instrução:
DBCC CHECKIDENT (Tabela, reseed, 0)
O último parâmetro se torna o valor atual do identity. Ao inserir o próximo registro, o mesmo virá com o seu Id com o valor identity somado de 1 (caso seja um identity de incremento 1), o valor do identity da tabela vai para 1, e assim por diante.
Recuperar o último valor inserido de um campo identity: Para recuperar o último valor de identity inserido (ex: inserir algo em uma tabela, e cadastrar um novo registro com o id do registro recém inserido), podemos utilizar:
@@IDENTITY, que retorna o valor do identity do último registro inserido na tabela, ou;
SCOPE_IDENTITY(), que retorna o último valor mas dentro do escopo em que a query foi executada.
Não recomendo a utilização de @@IDENTITY, pois isso pode acarretar problemas de consistência em cenários onde existe um alto grau de inserção/manipulação dos dados no banco (ou mais especificamente, na tabela em questão).
Um exemplo simples de uso pode ser:
DECLARE @techId INT INSERT INTO Tabela (Valor) VALUES (‘Testando Identity’) SELECT @techId = SCOPE_IDENTITY()
---
Um complemento em relação ao post original:
”Zavaschi, e se eu quiser inserir um registro em uma tabela, mas somente nessa inserção quero especificar o valor do campo identity. É possível?”
É sim, basta fazer da seguinte forma:
SET IDENTITY_INSERT Tabela ON INSERT INTO Tabela (Id, Valor) VALUES (123, ‘Informação’) SET IDENTITY_INSERT Tabela OFF
Simples, mas temos que lembrar que precisamos explicitar os campos, ainda que estejamos fazendo uma inserção em todas as colunas.
É isso, espero que tenham gostado!
Abraços!
Thiago Zavaschi