Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como inserir valores em uma coluna IDENTITY no SQL Server


Se você já tentou inserir valores em uma coluna de identidade no SQL Server, pode ter visto um erro como este:

Não é possível inserir um valor explícito para a coluna de identidade na tabela 'Artistas' quando IDENTITY_INSERT está definido como OFF.

Isto é normal. Uma coluna de identidade está lá por um motivo. Ele preenche automaticamente a coluna com um valor incremental para cada linha inserida. Portanto, não há necessidade de você inserir um valor nessa coluna.

No entanto, às vezes você faz precisa inserir um valor em uma coluna de identidade. Por exemplo, você pode estar preenchendo o banco de dados com dados que precisam reter seus próprios valores de identidade. Se for esse o caso, você precisará substituir a IDENTITY propriedade. Aqui está como.


Ativar IDENTITY_INSERT


Você pode substituir a IDENTITY propriedade ativando IDENTITY_INSERT . Isso permite que você insira seus próprios valores em uma coluna de identidade.

Aqui está um exemplo:
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;

Neste exemplo, a tabela Artistas tem uma coluna de identidade (neste caso, ArtistId é a coluna de identidade). Para substituir a IDENTITY simplesmente precedemos o INSERT declaração com SET IDENTITY_INSERT Artists ON . Esta instrução T-SQL permite que você diga “Eu sei que esta tabela tem uma coluna de identidade, mas neste caso, insira meu valores em vez disso”.

Observe que IDENTITY_INSERT só pode ser ativado em uma tabela por vez. Portanto, é uma boa ideia desabilitar IDENTITY_INSERT imediatamente após a inserção. Isso o coloca de volta ao seu estado original e permite que você substitua uma coluna de identidade em uma tabela diferente, se necessário.

Além disso, para habilitar IDENTITY_INSERT o usuário deve possuir a tabela ou ter ALTER permissão na mesa.

Copiando entre tabelas


Ativando IDENTITY_INSERT também pode ser útil quando você está copiando dados entre tabelas. Por exemplo, você pode estar preenchendo uma tabela de outra.

Aqui está um exemplo de cópia de dados da tabela Artists para a tabela Artists_Archive:
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;

Uma coisa a notar é que, se a coluna de identidade tiver uma restrição de chave primária, ela rejeitará quaisquer valores que já existam na tabela de destino. Portanto, você precisa ter certeza absoluta de que substituir a coluna de identidade é o que você definitivamente deseja fazer.