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

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse noParallel Data Warehouse

Crea una columna de identidad en una tabla.Creates an identity column in a table. Esta propiedad se usa con las instrucciones CREATE TABLE y ALTER TABLE de Transact-SQLTransact-SQL.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

Nota

La propiedad IDENTITY no es la misma que la propiedad Identity de SQL-DMO, que expone la propiedad de identidad de las filas de una columna.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax


IDENTITY [ (seed , increment) ]  

ArgumentosArguments

seedseed
Es el valor que se utiliza para la primera fila cargada en la tabla.Is the value that is used for the very first row loaded into the table.

incrementincrement
Se trata del valor incremental que se agrega al valor de identidad de la anterior fila cargada.Is the incremental value that is added to the identity value of the previous row that was loaded.

Debe especificar tanto el valor de inicialización como el incremento, o bien ninguno de los dos.You must specify both the seed and increment or neither. Si no se especifica ninguno, el valor predeterminado es (1,1).If neither is specified, the default is (1,1).

NotasRemarks

Las columnas de identidad pueden usarse para generar valores de clave.Identity columns can be used for generating key values. La propiedad de identidad de una columna garantiza lo siguiente:The identity property on a column guarantees the following:

  • Cada nuevo valor se genera basándose en el valor de inicialización y el incremento actual.Each new value is generated based on the current seed & increment.

  • Cada nuevo valor de una transacción determinada es diferente de otras transacciones simultáneas de la tabla.Each new value for a particular transaction is different from other concurrent transactions on the table.

    La propiedad de identidad de una columna no garantiza lo siguiente:The identity property on a column does not guarantee the following:

  • Unicidad del valor: La unicidad debe aplicarse mediante una restricción PRIMARY KEY o UNIQUE, o mediante un índice UNIQUE.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Valores consecutivos en una transacción: No se garantiza que una transacción que inserta varias filas obtenga valores consecutivos para las filas porque podrían producirse otras inserciones simultáneas en la tabla.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. Si los valores deben ser consecutivos, la transacción debe usar un bloqueo exclusivo en la tabla o usar el nivel de aislamiento 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 después de un reinicio del servidor u otros errores: SQL ServerSQL Server podría almacenar en memoria caché los valores de identidad por motivos de rendimiento y algunos de los valores asignados podrían perderse durante un error de la base de datos o un reinicio del 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. Esto puede tener como resultado espacios en el valor de identidad al insertarlo.This can result in gaps in the identity value upon insert. Si no es aceptable que haya espacios, la aplicación debe usar mecanismos propios para generar valores de clave.If gaps are not acceptable then the application should use its own mechanism to generate key values. El uso de un generador de secuencias con la opción NOCACHE puede limitar los espacios a transacciones que nunca se llevan a cabo.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • Reutilización de valores: Para una propiedad de identidad determinada, con un valor de inicialización e incremento específico, el motor no reutiliza los valores de identidad.Reuse of values – For a given identity property with specific seed/increment, the identity values are not reused by the engine. Si una instrucción de inserción concreta produce un error o si la instrucción de inserción se revierte, los valores de identidad utilizados se pierden y no volverán a generarse.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. Esto puede tener como resultado espacios cuando se generan los valores de identidad siguientes.This can result in gaps when the subsequent identity values are generated.

    Estas restricciones forman parte del diseño para mejorar el rendimiento y porque son aceptables en muchas situaciones comunes.These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. Si no puede usar valores de identidad debido a estas restricciones, cree una tabla independiente que contenga un valor actual y administre el acceso a la tabla y la asignación de números con su aplicación.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.

    Si una tabla con una columna de identidad se publica para replicarla, la columna de identidad debe administrarse de manera apropiada para el tipo de replicación utilizado.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 más información, vea Replicar columnas de identidad.For more information, see Replicate Identity Columns.

    Solo se puede crear una columna de identidad para cada tabla.Only one identity column can be created per table.

    En las tablas optimizadas para memoria, el valor de inicialización y el valor de incremento debe establecerse en 1,1.In memory-optimized tables the seed and increment must be set to 1,1. Si seed o increment se establecen en un valor distinto de 1, se produce este error: The use of seed and increment values other than 1 is not supported with memory optimized tables (No se admite el uso de valores seed e increment distintos de 1 con tablas optimizadas en memoria).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.

EjemplosExamples

A.A. Utilizar la propiedad IDENTITY con CREATE TABLEUsing the IDENTITY property with CREATE TABLE

En el siguiente ejemplo se crea una nueva tabla con la propiedad IDENTITY para un número de identificación que se incrementa automáticamente.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. Utilizar la sintaxis genérica para buscar espacios en los valores de identidadUsing generic syntax for finding gaps in identity values

En este ejemplo se muestra la sintaxis genérica utilizada para buscar espacios en valores de identidad cuando se quitan datos.The following example shows generic syntax for finding gaps in identity values when data is removed.

Nota

La primera parte del siguiente script de Transact-SQLTransact-SQL se ha diseñado solo como ejemplo.The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. Puede ejecutar el script de Transact-SQLTransact-SQL que comienza por el comentario: -- 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;  

Ver tambiénSee 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 (función de 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 columnas de identidadReplicate Identity Columns