Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jaka jest najlepsza praktyka wstawiania rekordu, jeśli jeszcze nie istnieje?

Kiedy potrzebujesz zagwarantować niepowtarzalność rekordów pod warunkiem, że nie może być wyrażony przez ograniczenie UNIQUE lub PRIMARY KEY, rzeczywiście musisz upewnić się, że sprawdzanie istnienia i wstawianie są wykonywane w jednej transakcji. Możesz to osiągnąć poprzez:

  1. Za pomocą jednej instrukcji SQL wykonującej sprawdzenie i wstawienie (trzecia opcja)
  2. Korzystanie z transakcji z odpowiednim poziomem izolacji

Istnieje jednak czwarty sposób, który pomoże ci lepiej ustrukturyzować kod, a także sprawi, że będzie działał w sytuacjach, w których musisz przetworzyć partię rekordów naraz. Możesz utworzyć zmienną TABLE lub tabelę tymczasową, wstawić wszystkie rekordy, które należy tam wstawić, a następnie na podstawie tej zmiennej napisać instrukcje INSERT, UPDATE i DELETE.

Poniżej znajduje się (pseudo)kod demonstrujący to podejście:

-- 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)

W wielu sytuacjach używam tego podejścia, ponieważ ułatwia ono odczytywanie kodu TSQL, umożliwia refaktoryzację i stosowanie testów jednostkowych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lista funkcji daty i czasu w SQL Server (T-SQL)

  2. Domyślna kolejność wierszy w zapytaniu SELECT — SQL Server 2008 vs SQL 2012

  3. Replikacja SQL Server wymaga rzeczywistej nazwy serwera, aby nawiązać połączenie z serwerem

  4. SqlConnection.Close() wewnątrz przy użyciu instrukcji

  5. Jak zmienić sortowanie na poziomie serwera uruchomionej instancji SQL Server?