En este artículo, exploraremos los conceptos básicos y los detalles de la propiedad IDENTITY de SQL Server y las características de la columna IDENTITY. Además, consideraremos cómo insertar valores explícitos en las columnas de identidad a través de la función IDENTITY_INSERT.
Introducción a la propiedad IDENTIDAD y la columna IDENTIDAD de SQL Server
En SQL Server, la propiedad de identidad nos permite crear columnas de identidad en las tablas de SQL Server según la configuración de la sintaxis de la propiedad de identidad. La sintaxis de la propiedad de identidad es la siguiente, y aplicamos esta sintaxis para crear o modificar una instrucción de tabla.
IDENTIDAD [(semilla, incremento)]
En primer lugar, examinaremos los parámetros de la propiedad de identidad. Esta propiedad toma dos parámetros de entrada:el primero es semilla y el segundo es incremento. El parámetro seed especifica que el primer valor inicial del valor insertado en la tabla y el parámetro Increment define el valor de incremento de los datos insertados.
Ahora, intensificaremos esta definición principal de propiedad de identidad con algunos ejemplos.
Cómo crear una columna de Identidad en SQL Server
Ejemplo-1 :En el siguiente ejemplo, crearemos una columna de identidad y el primer valor comenzará desde 1 y se incrementará de 1 en 1.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Ejemplo-2 :En el siguiente ejemplo, crearemos una columna de identidad y el primer valor comenzará desde 37 y se incrementará de 20 en 20.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(37,20) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') SELECT Id as [IdentityColumn],Col1 FROM TestIdentity
Como puede ver en el ejemplo anterior, la propiedad de identidad proporciona la generación de valores de incremento automático según los parámetros semilla e identidad.
¿Cómo insertar valores explícitos en la columna de identidad de SQL Server?
De forma predeterminada, la propiedad de identidad no nos permite insertar valores explícitos en las columnas de identidad. Si intenta insertar valores explícitos en una columna de identidad, experimentará el siguiente error.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES (1,'The first inserted row')
Mensaje 8101, Nivel 16, Estado 1, Línea 9
Un valor explícito para la columna de identidad en table, 'TestIdentity' solo se puede especificar cuando se usa una lista de columnas y IDENTITY_INSERT está activado.
Podemos superar este error habilitando la función IDENTITY_INSERT de la tabla. Ahora, cambiaremos la declaración de inserción de la siguiente manera.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Otro punto clave sobre este tema es que tenemos que escribir una lista de columnas para insertar la declaración. Si no hacemos esto, experimentaremos el siguiente error.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity VALUES (1,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF
Mensaje 8101, Nivel 16, Estado 1, Línea 9
Un valor explícito para la columna de identidad en table, 'TestIdentity' solo se puede especificar cuando se usa una lista de columnas y IDENTITY_INSERT está activado.
Este error define que falta la lista de columnas en la declaración de inserción. En la declaración de inserción a continuación, corregiremos este error.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The first inserted row') SET IDENTITY_INSERT TestIdentity OFF
En algunos casos, necesitamos insertar datos en una tabla desde otra tabla. Una de las mejores formas de realizar esta operación es utilizar las declaraciones "INSERT INTO SELECT". Sin embargo, si la tabla de destino tiene una columna de identidad, debemos habilitar la opción IDENTITY_INSERT en la tabla de destino. Además, tenemos que escribir la lista de columnas de la tabla de destino.
DROP TABLE IF EXISTS TestIdentity DROP TABLE IF EXISTS SourceTable CREATE TABLE SourceTable (ID INT, Val1 VARCHAR(100)) INSERT INTO SourceTable VALUES (1,'First Row'),(2,'Second Row') GO CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) SELECT * FROM SourceTable SET IDENTITY_INSERT TestIdentity OFF
El inconveniente de la opción IDENTITY_INSERT es que puede generar una brecha entre los valores de la columna de identidad. Una declaración similar a la siguiente generará una brecha entre los valores de la columna de identidad.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) INSERT INTO TestIdentity ---column list VALUES ('The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) ---column list VALUES (90,'The second inserted row (INDENTITY_INSERT_ON') SET IDENTITY_INSERT TestIdentity OFF INSERT INTO TestIdentity ---column list VALUES ('The third inserted row (INDENTITY_INSERT_OFF)') SELECT * FROM TestIdentity
Comando DBCC CHECKIDENT
El comando DBCC CHECKIDENT nos permite obtener detalles sobre el último valor de la columna de identidad. Esta función también permite restablecer y cambiar el valor actual de la columna de identidad a otro valor. Ahora, obtendremos el último valor de la identidad mediante el comando DBCC CHECKIDENT.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') DBCC CHECKIDENT ('TestIdentity', NORESEED)
Otra opción sobre el comando DBCC CHECKIDENT es restablecer la columna de identidad a un valor requerido. En el siguiente ejemplo, el parámetro RESEED cambia el valor máximo de la columna de identidad a 100 y los valores insertados posteriormente usan este valor máximo.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) GO INSERT INTO TestIdentity VALUES ('The first inserted row') INSERT INTO TestIdentity VALUES ('The second inserted row') INSERT INTO TestIdentity VALUES ('The third inserted row') INSERT INTO TestIdentity VALUES ('The fourth inserted row') GO DBCC CHECKIDENT ('TestIdentity',RESEED,100) GO INSERT INTO TestIdentity VALUES ('The fifth inserted row') SELECT * FROM TestIdentity
Columna de identidad y exclusividad de SQL Server
Las columnas de identidad no garantizan la generación de valores únicos. Este es el problema común de confusión sobre las columnas de identidad, por lo que si queremos garantizar la unicidad de los valores generados, podemos usar el índice único para estas columnas. Ahora, probaremos y demostraremos cómo crear valores duplicados sobre las columnas de identidad.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) , Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Además, las columnas de identidad y las claves principales son dos objetos diferentes en SQL Server. El propósito de uso de la columna de identidad es generar el número de incremento automático. Por otro lado, la restricción de clave principal garantiza y proporciona la unicidad de los valores en una columna en particular. La restricción de clave principal impone los valores únicos para las columnas definidas porque, de forma predeterminada, la clave principal crea un índice único agrupado en la tabla. En el uso común, la restricción de clave principal y la propiedad de identidad se pueden utilizar juntas. Este enfoque de uso nos ayuda a llevar la flexibilidad de la unicidad de la clave principal y la función de incremento automático de identidad a la columna aplicada. En el siguiente ejemplo, también agregaremos una restricción de clave principal a la columna Id y evitará que se dupliquen los valores insertados.
DROP TABLE IF EXISTS TestIdentity CREATE TABLE TestIdentity (Id INT IDENTITY(1,1) PRIMARY KEY, Col1 VARCHAR(100)) SET IDENTITY_INSERT TestIdentity ON INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') INSERT INTO TestIdentity (Id,Col1) VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFF SELECT * FROM TestIdentity
Cuando navegamos por la pestaña Índices de la tabla TestIdentity en el explorador de objetos, podemos encontrar un índice agrupado único creado por la restricción de clave principal. Esta restricción se aplica a valores únicos para la columna Id.
Conclusión
En este artículo, discutimos los conceptos fundamentales y los métodos de uso de la propiedad de identidad de SQL Server y las columnas de identidad.
Referencias
- CREAR TABLA (Transact-SQL) IDENTIDAD (Propiedad)
- Crear claves principales