Sök…
Introduktion
MERGE (ofta även kallad UPSERT för "uppdatering eller infoga") gör det möjligt att infoga nya rader eller, om en rad redan finns, för att uppdatera den befintliga raden. Poängen är att utföra hela uppsättningen atomiskt (för att garantera att informationen förblir konsekvent) och att förhindra kommunikationsomkostnader för flera SQL-uttalanden i ett klient / serversystem.
FÖLJ för att göra Mål matchningskälla
MERGE INTO targetTable t
USING sourceTable s
ON t.PKID = s.PKID
WHEN MATCHED AND NOT EXISTS (
SELECT s.ColumnA, s.ColumnB, s.ColumnC
INTERSECT
SELECT t.ColumnA, t.ColumnB, s.ColumnC
)
THEN UPDATE SET
t.ColumnA = s.ColumnA
,t.ColumnB = s.ColumnB
,t.ColumnC = s.ColumnC
WHEN NOT MATCHED BY TARGET
THEN INSERT (PKID, ColumnA, ColumnB, ColumnC)
VALUES (s.PKID, s.ColumnA, s.ColumnB, s.ColumnC)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
;
Obs: Delen AND NOT EXISTS
förhindrar uppdatering av poster som inte har ändrats. Användning av INTERSECT
konstruktionen gör det möjligt att INTERSECT
nollbara kolumner utan speciell hantering.
MySQL: räknar användare efter namn
Anta att vi vill veta hur många användare som har samma namn. Låt oss skapa users
enligt följande:
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
Nu har vi precis upptäckt en ny användare med namnet Joe och vill ta hänsyn till honom. För att uppnå detta måste vi avgöra om det finns en befintlig rad med hans namn, och i så fall uppdatera den till inkrementräkning; å andra sidan, om det inte finns någon befintlig rad, bör vi skapa den.
MySQL använder följande syntax: infoga ... i duplikatnyckeluppdatering .... I detta fall:
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL: räknar användare efter namn
Anta att vi vill veta hur många användare som har samma namn. Låt oss skapa users
enligt följande:
create table users(
id serial,
name varchar(8) unique,
count int
);
Nu har vi precis upptäckt en ny användare med namnet Joe och vill ta hänsyn till honom. För att uppnå detta måste vi avgöra om det finns en befintlig rad med hans namn, och i så fall uppdatera den till inkrementräkning; å andra sidan, om det inte finns någon befintlig rad, bör vi skapa den.
PostgreSQL använder följande syntax: infoga ... på konflikt ... uppdatera ... I detta fall:
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;