sql >> Databáze >  >> RDS >> Sqlserver

Jaký je nejlepší postup pro vložení záznamu, pokud ještě neexistuje?

Když potřebujete zaručit jedinečnost záznamů za podmínky, kterou nelze vyjádřit omezením UNIKÁTNÍHO nebo PRIMÁRNÍHO KLÍČE, musíte se skutečně ujistit, že kontrola existence a vložení jsou prováděny v jedné transakci. Můžete toho dosáhnout buď:

  1. Použití jednoho příkazu SQL pro provedení kontroly a vložení (vaše třetí možnost)
  2. Použití transakce s příslušnou úrovní izolace

Existuje však čtvrtý způsob, který vám pomůže lépe strukturovat váš kód a také jej zprovozní v situacích, kdy potřebujete zpracovat dávku záznamů najednou. Můžete vytvořit proměnnou TABLE nebo dočasnou tabulku, vložit do ní všechny záznamy, které je třeba vložit, a poté na základě této proměnné napsat příkazy INSERT, UPDATE a DELETE.

Níže je (pseudo)kód demonstrující tento přístup:

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

V mnoha situacích používám tento přístup, protože usnadňuje čtení kódu TSQL, je možné jej refaktorovat a aplikovat na něj jednotkové testy.



  1. Problém s SQLiteOpenHelper na Androidu 2.X a 3.X

  2. Proč se mé připojení ODBC nezdaří při spuštění načtení SSIS v sadě Visual Studio, ale ne při spuštění stejného balíčku pomocí nástroje Execute Package Utility

  3. Návrat XFS na Linux

  4. SQL dotaz pro rozdělení dat sloupců do řádků