CREATE TABLE (Transact-SQL) IDENTITY (Propriedade)CREATE TABLE (Transact-SQL) IDENTITY (Property)

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir de 2008)simAzure SQL DatabasesimAzure SQL Data Warehouse nãoParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse noParallel Data Warehouse

Cria uma coluna de identidade em uma tabela.Creates an identity column in a table. Esta propriedade é usada com as instruções CREATE TABLE e ALTER TABLE Transact-SQLTransact-SQL.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

Observação

A propriedade IDENTITY é diferente da propriedadeIdentity de SQL-DMO que expõe a propriedade de identidade de linha de uma coluna.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax


IDENTITY [ (seed , increment) ]  

ArgumentosArguments

seedseed
É o valor usado para a primeira linha carregada na tabela.Is the value that is used for the very first row loaded into the table.

incrementincrement
É o valor de incremento adicionado ao valor de identidade da linha anterior que foi carregada.Is the incremental value that is added to the identity value of the previous row that was loaded.

Você deve especificar seed e increment, ou nenhum dos dois.You must specify both the seed and increment or neither. Se nenhum for especificado, o padrão será (1,1).If neither is specified, the default is (1,1).

RemarksRemarks

As colunas de identidade podem ser usadas para gerar valores de chave.Identity columns can be used for generating key values. A propriedade de identidade em uma coluna garante o seguinte:The identity property on a column guarantees the following:

  • Cada novo valor é gerado com base nos valores de seed e increment atuais.Each new value is generated based on the current seed & increment.

  • Cada novo valor para uma transação específica é diferente de outras transações simultâneas na tabela.Each new value for a particular transaction is different from other concurrent transactions on the table.

    A propriedade de identidade em uma coluna não garante o seguinte:The identity property on a column does not guarantee the following:

  • Exclusividade do valor – a exclusividade deve ser imposta usando um PRIMARY KEY ou restrição UNIQUE ou índice UNIQUE.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Valores consecutivos em uma transação – não é garantido que uma transação que insere várias linhas vá obter valores consecutivos para as linhas porque as demais inserções simultâneas podem ocorrer na tabela.Consecutive values within a transaction – A transaction inserting multiple rows is not guaranteed to get consecutive values for the rows because other concurrent inserts might occur on the table. Se os valores precisarem ser consecutivos, a transação deverá usar um bloqueio exclusivo na tabela ou usar o nível de isolamento SERIALIZABLE.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.

  • Valores consecutivos após o reinício do servidor ou outras falhas – o SQL ServerSQL Server pode armazenar em cache valores de identidade por questões de desempenho e alguns dos valores atribuídos podem ser perdidos durante uma falha de banco de dados ou uma reinicialização do servidor.Consecutive values after server restart or other failuresSQL ServerSQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. Isso pode resultar em intervalos no valor de identidade após a inserção.This can result in gaps in the identity value upon insert. Se não forem aceitos intervalos, o aplicativo deverá usar seu próprio mecanismo para gerar valores de chave.If gaps are not acceptable then the application should use its own mechanism to generate key values. Usar um gerador de sequência com a opção NOCACHE pode limitar os intervalos de transações que nunca são confirmadas.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • Reutilização de valores – para determinada propriedade de identidade com seed/increment específicos, os valores de identidade não são reutilizados pelo mecanismo.Reuse of values – For a given identity property with specific seed/increment, the identity values are not reused by the engine. Se uma instrução de inserção específica falhar ou se a instrução de inserção for revertida, os valores de identidade consumidos serão perdidos e não serão gerados novamente.If a particular insert statement fails or if the insert statement is rolled back then the consumed identity values are lost and will not be generated again. Isso pode resultar em intervalos quando os valores de identidade subsequentes são gerados.This can result in gaps when the subsequent identity values are generated.

    Essas restrições são parte do design para melhorar o desempenho, e por serem aceitáveis em muitas situações comuns.These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. Se você não pode usar valores de identidade devido a essas restrições, crie uma tabela separada contendo um valor atual e gerencie o acesso à tabela e a atribuição de número com seu aplicativo.If you cannot use identity values because of these restrictions, create a separate table holding a current value and manage access to the table and number assignment with your application.

    Se uma tabela com uma coluna de identidade for publicada para replicação, a coluna de identidade deverá ser gerenciada de uma forma apropriada para o tipo de replicação usado.If a table with an identity column is published for replication, the identity column must be managed in a way that is appropriate for the type of replication used. Para obter mais informações, consulte Replicar colunas de identidade.For more information, see Replicate Identity Columns.

    Apenas uma coluna de identidade pode ser criada por tabela.Only one identity column can be created per table.

    Em tabelas com otimização de memória, a semente e o incremento devem ser definidos para 1.1.In memory-optimized tables the seed and increment must be set to 1,1. Configurar seed ou increment como um valor diferente de 1 resulta no seguinte erro: o uso de valores seed e increment diferentes de 1 não é compatível com tabelas com otimização de memória.Setting the seed or increment to a value other than 1 results in the following error: The use of seed and increment values other than 1 is not supported with memory optimized tables.

ExemplosExamples

A.A. Usando a propriedade IDENTITY com CREATE TABLEUsing the IDENTITY property with CREATE TABLE

O exemplo a seguir cria uma nova tabela que usa a propriedade IDENTITY para um número de identificação automaticamente incrementando.The following example creates a new table using the IDENTITY property for an automatically incrementing identification number.

USE AdventureWorks2012;  

IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL  
   DROP TABLE new_employees;  
GO  
CREATE TABLE new_employees  
(  
 id_num int IDENTITY(1,1),  
 fname varchar (20),  
 minit char(1),  
 lname varchar(30)  
);  

INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Karin', 'F', 'Josephs');  

INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Pirkko', 'O', 'Koskitalo');  

B.B. Usando sintaxe genérica para localizar intervalos em valores de identidadeUsing generic syntax for finding gaps in identity values

O exemplo a seguir mostra a sintaxe genérica para localizar intervalos em valores de identidade quando os dados são removidos.The following example shows generic syntax for finding gaps in identity values when data is removed.

Observação

A primeira parte do script Transact-SQLTransact-SQL a seguir foi criada apenas para fins de ilustração.The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. Você pode executar o script Transact-SQLTransact-SQL que inicia com o comentário: -- Create the img table.You can run the Transact-SQLTransact-SQL script that starts with the comment: -- Create the img table.

-- Here is the generic syntax for finding identity value gaps in data.  
-- The illustrative example starts here.  
SET IDENTITY_INSERT tablename ON;  
DECLARE @minidentval column_type;  
DECLARE @maxidentval column_type;  
DECLARE @nextidentval column_type;  
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)  
    FROM tablename  
IF @minidentval = IDENT_SEED('tablename')  
   SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')  
   FROM tablename t1  
   WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND   
      @maxidentval AND  
      NOT EXISTS (SELECT * FROM tablename t2  
         WHERE t2.$IDENTITY = t1.$IDENTITY +   
            IDENT_INCR('tablename'))  
ELSE  
   SELECT @nextidentval = IDENT_SEED('tablename');  
SET IDENTITY_INSERT tablename OFF;  
-- Here is an example to find gaps in the actual data.  
-- The table is called img and has two columns: the first column   
-- called id_num, which is an increasing identification number, and the   
-- second column called company_name.  
-- This is the end of the illustration example.  

-- Create the img table.  
-- If the img table already exists, drop it.  
-- Create the img table.  
IF OBJECT_ID ('dbo.img', 'U') IS NOT NULL  
   DROP TABLE img;  
GO  
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname);  
INSERT img(company_name) VALUES ('New Moon Books');  
INSERT img(company_name) VALUES ('Lucerne Publishing');  
-- SET IDENTITY_INSERT ON and use in img table.  
SET IDENTITY_INSERT img ON;  

DECLARE @minidentval smallint;  
DECLARE @nextidentval smallint;  
SELECT @minidentval = MIN($IDENTITY) FROM img  
 IF @minidentval = IDENT_SEED('img')  
    SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')  
    FROM img t1  
    WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND  
      NOT    EXISTS (SELECT * FROM img t2  
          WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))  
 ELSE  
    SELECT @nextidentval = IDENT_SEED('img');  
SET IDENTITY_INSERT img OFF;  

Consulte TambémSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL) DBCC CHECKIDENT (Transact-SQL)
IDENT_INCR (Transact-SQL) IDENT_INCR (Transact-SQL)
@@IDENTITY (Transact-SQL) @@IDENTITY (Transact-SQL)
IDENTITY (função) (Transact-SQL) IDENTITY (Function) (Transact-SQL)
IDENT_SEED (Transact-SQL) IDENT_SEED (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
SET IDENTITY_INSERT (Transact-SQL) SET IDENTITY_INSERT (Transact-SQL)
Replicar colunas de identidadeReplicate Identity Columns