sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo insertar valores en una columna de IDENTIDAD en SQL Server

Si alguna vez ha intentado insertar valores en una columna de identidad en SQL Server, es posible que haya visto un error como este:

No se puede insertar un valor explícito para la columna de identidad en la tabla "Artistas" cuando IDENTITY_INSERT está desactivado.

Esto es normal. Una columna de identidad está ahí por una razón. Rellena automáticamente la columna con un valor incremental para cada fila que se inserta. Por lo tanto, no es necesario que inserte un valor en esa columna.

Sin embargo, a veces haces necesita insertar un valor en una columna de identidad. Por ejemplo, podría llenar la base de datos con datos que necesitan conservar sus propios valores de identidad. Si este es el caso, deberá anular la IDENTITY propiedad. Así es como.

Habilitar IDENTIDAD_INSERT

Puede anular la IDENTITY propiedad habilitando IDENTITY_INSERT . Esto le permite insertar sus propios valores en una columna de identidad.

He aquí un ejemplo:

SET IDENTITY_INSERT Artists ON;
INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom)   
VALUES 
  (1001, 'AC/DC','1973-01-11'), 
  (1002, 'Allan Holdsworth','1969-01-01'),
  (1003, 'Buddy Rich','1919-01-01');
SET IDENTITY_INSERT Artists OFF;

En este ejemplo, la tabla Artistas tiene una columna de identidad (en este caso, ArtistId es la columna de identidad). Para anular la IDENTITY propiedad simplemente precedemos al INSERT declaración con SET IDENTITY_INSERT Artists ON . Esta instrucción T-SQL le permite decir "Sé que esta tabla tiene una columna de identidad, pero en este caso, inserte my valores en su lugar”.

Tenga en cuenta que IDENTITY_INSERT solo se puede habilitar en una mesa a la vez. Por lo tanto, es una buena idea deshabilitar IDENTITY_INSERT inmediatamente después de la inserción. Esto lo devuelve a su estado original y le permite anular una columna de identidad en una tabla diferente si es necesario.

Además, para habilitar IDENTITY_INSERT el usuario debe poseer la tabla o tener ALTER permiso sobre la mesa.

Copiar entre tablas

Habilitando IDENTITY_INSERT también puede ser útil para copiar datos entre tablas. Por ejemplo, podría estar completando una tabla desde otra.

Este es un ejemplo de cómo copiar datos de la tabla Artistas a la tabla Artistas_Archivo:

SET IDENTITY_INSERT Artists_Archive ON;
INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom)
  SELECT ArtistId, ArtistName, ActiveFrom
	FROM Artists;
SET IDENTITY_INSERT Artists_Archive OFF;

Una cosa a tener en cuenta es que, si la columna de identidad tiene una restricción de clave principal, rechazará cualquier valor que ya exista en la tabla de destino. Por lo tanto, debe estar absolutamente seguro de que anular la columna de identidad es lo que definitivamente desea hacer.