sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er fordelene ved MERGE frem for simple IF EXISTS?

MERGE kombinerer INSERT, UPDATE og DELETE logik i én DML-sætning og er derfor atomisk. Hvis du laver UPSERTS på en række, er fordelene mindre indlysende. For eksempel kan en naiv implementering af en UPSERT se ud som følger:

IF  EXISTS (SELECT * FROM t1 where [email protected])
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)

Men uden at pakke dette ind i en transaktion, er det muligt, at den række, vi skal opdatere, bliver slettet mellem SELECT og OPDATERING. Tilføjelse af minimal logik for at løse dette problem giver os dette:

BEGIN TRAN
IF  EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where [email protected] )
    UPDATE t1 SET ... WHERE [email protected]
ELSE
    INSERT INTO t1 (...) VALUES (...)
COMMIT

Denne logik er ikke nødvendig med MERGE-sætningen.

Der er ingen sammenligninger, der skal drages mellem CURSORS og MERGE-sætningen.



  1. Hvad er der galt med denne kode, der bruger mysql-udvidelsen til at hente data fra en database i PHP?

  2. Postgresql create extension mislykkes

  3. Visninger i SQL Server

  4. Databasenavngivningskonventioner fra Microsoft?