Neste artigo, exploraremos os conceitos básicos e os detalhes da propriedade IDENTITY do SQL Server e os recursos da coluna IDENTITY. Além disso, consideraremos como inserir valores explícitos nas colunas de identidade por meio do recurso IDENTITY_INSERT.
Introdução à propriedade IDENTITY e à coluna IDENTITY do SQL Server
No SQL Server, a propriedade identity nos permite criar colunas de identidade nas tabelas do SQL Server de acordo com as configurações da sintaxe da propriedade identity. A sintaxe da propriedade identity tem a seguinte aparência e aplicamos essa sintaxe para criar ou alterar uma instrução de tabela.
IDENTIDADE [(semente, incremento)]
Inicialmente, examinaremos os parâmetros da propriedade identity. Esta propriedade recebe dois parâmetros de entrada:o primeiro é semente e o segundo é incremento. O parâmetro seed especifica que o primeiro valor inicial do valor inserido na tabela e o parâmetro Increment definem o valor de incremento dos dados inseridos.
Agora, vamos intensificar essa definição principal de propriedade de identidade com alguns exemplos.
Como criar uma coluna de identidade no SQL Server
Exemplo-1 :No exemplo a seguir, criaremos uma coluna de identidade e o primeiro valor começará em 1 e incrementará 1 em 1.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES('A primeira linha inserida')INSERT INTO TestIdentityVALUES('A segunda linha inserida')INSERT INTO TestIdentityVALUES ('A terceira linha inserida')INSERT INTO TestIdentityVALUES ('A quarta linha inserida')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Exemplo-2 :No exemplo a seguir, criaremos uma coluna de identidade e o primeiro valor começará em 37 e incrementará 20 por 20.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(37,20) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES('A primeira linha inserida')INSERT INTO TestIdentityVALUES('A segunda linha inserida')INSERT INTO TestIdentityVALUES ('A terceira linha inserida')INSERT INTO TestIdentityVALUES ('A quarta linha inserida')SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Como você pode ver no exemplo acima, a propriedade identity fornece a geração dos valores de incremento automático de acordo com os parâmetros de semente e identidade.
Como inserir valores explícitos na coluna de identidade do SQL Server?
Por padrão, a propriedade identity não nos permite inserir valores explícitos nas colunas de identidade. Se você tentar inserir valores explícitos em uma coluna de identidade, ocorrerá o seguinte erro.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES (1,'A primeira linha inserida')
Msg 8101, Nível 16, Estado 1, Linha 9
Um valor explícito para a coluna de identidade em table, 'TestIdentity' só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está ON.
Podemos superar esse erro ativando o recurso IDENTITY_INSERT da tabela. Agora, vamos alterar a instrução insert da seguinte forma.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) VALUES (1,'A primeira linha inserida')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Outro ponto chave sobre esta questão é que temos que escrever uma lista de colunas para inserir a declaração. Se não fizermos isso, teremos o seguinte erro.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1,'A primeira linha inserida')SET IDENTITY_INSERT TestIdentity OFF
Msg 8101, Nível 16, Estado 1, Linha 9
Um valor explícito para a coluna de identidade em table, 'TestIdentity' só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está ON.
Este erro define que a lista de colunas está ausente na instrução de inserção. Na instrução de inserção abaixo, corrigiremos esse erro.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---column listVALUES (90,'A primeira linha inserida ')SET IDENTITY_INSERT TestIdentity OFF
Em alguns casos, precisamos inserir dados em uma tabela de outra tabela. Uma das melhores maneiras de realizar esta operação é usar as instruções “INSERT INTO SELECT”. No entanto, se a tabela de destino tiver uma coluna de identidade, precisamos habilitar a opção IDENTITY_INSERT na tabela de destino. Além disso, temos que escrever a lista de colunas da tabela de destino.
DROP TABLE IF EXISTS TestIdentityDROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT,Val1 VARCHAR(100))INSERT INTO SourceTable VALUES (1,'Primeira Linha'),(2,'Segunda Linha')GOCREATE TABLE TestIdentity( Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF
A desvantagem da opção IDENTITY_INSERT é que ela pode causar uma lacuna entre os valores da coluna de identidade. Uma instrução semelhante à seguinte gerará uma lacuna entre os valores da coluna de identidade.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))INSERT INTO TestIdentity ---column listVALUES('A primeira linha inserida (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1) ---column listVALUES (90,'A segunda linha inserida (INDENTITY_INSERT_ON')SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity ---column listVALUES ('A terceira linha inserida (INDENTITY_INSERT_OFF)')SELECT * FROM TestIdentity
Comando DBCC CHECKIDENT
O comando DBCC CHECKIDENT nos permite obter detalhes sobre o último valor da coluna de identidade. Esta função também permite redefinir e alterar o valor atual da coluna de identidade para outro valor. Agora, obteremos o último valor da identidade através do comando DBCC CHECKIDENT.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES('A primeira linha inserida')INSERT INTO TestIdentityVALUES('A segunda linha inserida')INSERT INTO TestIdentityVALUES ('A terceira linha inserida')INSERT INTO TestIdentityVALUES ('A quarta linha inserida')DBCC CHECKIDENT ('TestIdentity', NORESEED)
Outra opção sobre o comando DBCC CHECKIDENT é redefinir a coluna de identidade para um valor obrigatório. No exemplo a seguir, o parâmetro RESEED altera o valor máximo da coluna de identidade para 100 e os valores inseridos posteriormente usam esse valor máximo.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))GOINSERT INTO TestIdentityVALUES('A primeira linha inserida')INSERT INTO TestIdentityVALUES('A segunda linha inserida')INSERT INTO TestIdentityVALUES ('A terceira linha inserida')INSERT INTO TestIdentityVALUES ('A quarta linha inserida')GODBCC CHECKIDENT ('TestIdentity',RESEED,100)GOINSERT INTO TestIdentityVALUES ('A quinta linha inserida')SELECT * FROM TestIdentity
Coluna de identidade e exclusividade do SQL Server
As colunas de identidade não garantem a geração de valores exclusivos. Esse é o problema comum confuso sobre as colunas de identidade, portanto, se quisermos garantir a exclusividade dos valores gerados, podemos usar o índice exclusivo para essas colunas. Agora, vamos provar e demonstrar como criar valores duplicados nas colunas de identidade.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) ,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'A primeira linha inserida (INDENTITY_INSERT_OFF)' )INSERT INTO TestIdentity (Id,Col1)VALUES (1,'A primeira linha inserida (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Além disso, Colunas de Identidade e Chaves Primárias são dois objetos diferentes no SQL Server. A finalidade de uso da coluna de identidade é gerar o número incrementado automaticamente. Por outro lado, a restrição de chave primária garante e fornece a exclusividade dos valores em uma determinada coluna. A restrição de Chave Primária impõe os valores exclusivos para as colunas definidas porque, por padrão, a Chave Primária cria um índice exclusivo clusterizado na tabela. No uso comum, a restrição de chave primária e a propriedade de identidade podem ser utilizadas juntas. Essa abordagem de uso nos ajuda a trazer a flexibilidade da exclusividade da Chave Primária e o recurso de incremento automático de identidade para a coluna aplicada. No exemplo a seguir, também adicionaremos uma restrição de chave primária à coluna Id e impedirá a duplicação de valores inseridos.
DROP TABLE IF EXISTS TestIdentityCREATE TABLE TestIdentity(Id INT IDENTITY(1,1) PRIMARY KEY,Col1 VARCHAR(100))SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id,Col1)VALUES (1,'A primeira linha inserida (INDENTITY_INSERT_OFF )')INSERT INTO TestIdentity (Id,Col1)VALUES (1,'A primeira linha inserida (INDENTITY_INSERT_OFF)')SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Quando navegamos na guia Índices da tabela TestIdentity no explorador de objetos, podemos descobrir um índice clusterizado exclusivo criado por restrição de chave primária. Essa restrição é aplicada a valores exclusivos para a coluna Id.
Conclusão
Neste artigo, discutimos os conceitos fundamentais e os métodos de uso da propriedade SQL Server Identity e das colunas Identity.
Referências
- CREATE TABLE (Transact-SQL) IDENTITY (Propriedade)
- Criar chaves primárias