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

Qual é a melhor prática para inserir um registro se ele ainda não existir?


Quando você precisa garantir a exclusividade de registros em uma condição que não pode ser expressa por uma restrição UNIQUE ou PRIMARY KEY, você realmente precisa ter certeza de que a verificação de existência e a inserção estão sendo feitas em uma transação. Você pode conseguir isso por:
  1. Usando uma instrução SQL realizando a verificação e a inserção (sua terceira opção)
  2. Usando uma transação com o nível de isolamento apropriado

No entanto, existe uma quarta maneira que o ajudará a estruturar melhor seu código e também a fazê-lo funcionar em situações em que você precisa processar um lote de registros de uma só vez. Você pode criar uma variável TABLE ou uma tabela temporária, inserir todos os registros que precisam ser inseridos nela e então escrever as instruções INSERT, UPDATE e DELETE com base nessa variável.

Abaixo está o (pseudo) código demonstrando essa abordagem:
-- Logic to create the data to be inserted if necessary

DECLARE @toInsert TABLE (idCol INT PRIMARY KEY,dataCol VARCHAR(MAX))
INSERT INTO @toInsert (idCol,dataCol) VALUES (1,'row 1'),(2,'row 2'),(3,'row 3')

-- Logic to insert the data

INSERT INTO realTable (idCol,dataCol)
SELECT TI.*
FROM @toInsert TI
WHERE NOT EXISTS (SELECT 1 FROM realTable RT WHERE RT.dataCol=TI.dataCol)

Em muitas situações eu uso essa abordagem, pois torna o código TSQL mais fácil de ler, possível refatorar e aplicar testes de unidade.