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

Udløser en opdatering en INSERT-hændelse, da alle opdateringer er DELETE + (gen)INSERT i SQL Server

En opdatering udløser aldrig en insert-hændelse, selvom den fysisk er implementeret som en insert/delete, da operationen logisk set stadig er en UPDATE .

Der er en sætning i det accepterede svar, som ikke er helt sandt, hvis det tages for at tale om logiske opdateringer af nøglekolonnen.

Dette er ikke tilfældet for en opdatering med flere rækker mod et unikt indeks. For dem giver SQL Server en plan med opdel/sortér/skjul sammen operatører. Så i det følgende eksempel bliver de 9 opdateringsoperationer konverteret til 1 sletning, 8 opdateringer og en indsættelse.

CREATE TABLE TestingUpdate7 (
ID INT,
SomeString CHAR(50)
)

CREATE UNIQUE CLUSTERED INDEX idx_ID ON TestingUpdate7 (ID)

INSERT INTO TestingUpdate7 (ID, SomeString)
VALUES
(1,'One'),(2,'Two'),(3,'Three'),(4,'Four'),
(5,'Five'),(6,'Six'),(7,'Seven'),(8,'Eight'),(9,'Nine')

CHECKPOINT -- truncate the log, DB is in simple recovery.

UPDATE TestingUpdate7
SET  ID +=1

SELECT Operation, Context, AllocUnitName 
FROM fn_dblog(NULL, NULL) 
 

Returnerer

+-----------------+--------------------+---------------------------+ | Operation | Context | AllocUnitName | +-----------------+--------------------+---------------------------+ | LOP_BEGIN_CKPT | LCX_NULL | NULL | | LOP_XACT_CKPT | LCX_BOOT_PAGE_CKPT | NULL | | LOP_END_CKPT | LCX_NULL | NULL | | LOP_BEGIN_XACT | LCX_NULL | NULL | | LOP_DELETE_ROWS | LCX_MARK_AS_GHOST | dbo.TestingUpdate7.idx_ID | | LOP_SET_BITS | LCX_PFS | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_MODIFY_ROW | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_INSERT_ROWS | LCX_CLUSTERED | dbo.TestingUpdate7.idx_ID | | LOP_COMMIT_XACT | LCX_NULL | NULL | +-----------------+--------------------+---------------------------+

  1. SQL Server-markørtyper - Frem kun statisk markør | SQL Server Tutorial / TSQL Tutorial

  2. Korrekt måde at overføre mellem 5.000 til 100.000 værdier i mysql WHERE-sætning

  3. Sådan ændres tabel i Oracle

  4. Kan ikke indlæse driver:com.microsoft.sqlserver.jdbc.SQLServerDriver weblogic 10g