Una columna del tipo IDENTITY
no puede recibir un valor explícito, ya que es el motor el que se encarga de completarlo, en este caso con un numérico incremental.
La forma normal de hacer un INSERT
, dónde dejamos que el motor complete este dato es quitar la columna de la sentencia, por ejemplo:
INSERT INTO TiposComprobantes (Nombre) VALUES ('Factura A');
Sin embargo, aún siendo un IDENTITY
puede que necesitemos insertar un valor explícito, por ejemplo en un sistema heredado, tal vez el ID
ya se encuentre referenciado en otras tablas y debamos mantener esta consistencia. En estos casos podemos “deshabilitar” el comportamiento por defecto del IDENTITY
, mediante la clausula SET IDENTITY_INSERT
, por ejemplo:
SET IDENTITY_INSERT TiposComprobantes ON
INSERT INTO TiposComprobantes (Id, Nombre) VALUES (1, 'Factura A');
SET IDENTITY_INSERT TiposComprobantes OFF
Comentarios:
- Con
SET IDENTITY_INSERT <NombreTabla> ON
permitimos la actualización de valores explícitos en la Tabla, una vez hecho esto, siempre que el valor insertado sea superior al máximo de la tabla, se actualiza la semilla delIDENTITY
. - Recordar que una columna
IDENTITY
no implica necesariamente que el valor de la misma sea estrictamente único, esto lo define una clave de este tipo. - Para hacer esto debemos tener permisos de
ALTER
sobre la tabla. - Solo una tabla puede tener la condición de
IDENTITY_INSERT ON
en la sesión / conexión activa, tratar de hacer lo mismo con otra tabla arrojará un error.