Ricerca…
introduzione
MERGE (spesso chiamato anche UPSERT per "aggiornamento o inserimento") consente di inserire nuove righe o, se esiste già una riga, di aggiornare la riga esistente. Il punto è di eseguire l'intero set di operazioni atomicamente (per garantire che i dati rimangano coerenti) e per prevenire l'overhead di comunicazione per più istruzioni SQL in un sistema client / server.
MERGE per rendere Target match Source
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
;
Nota: la parte AND NOT EXISTS
impedisce l'aggiornamento di record che non sono stati modificati. L'utilizzo del costrutto INTERSECT
consente di confrontare le colonne nullable senza una gestione speciale.
MySQL: contando gli utenti per nome
Supponiamo di voler sapere quanti utenti hanno lo stesso nome. Cerchiamo di creare users
tabelle come segue:
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
Ora, abbiamo appena scoperto un nuovo utente di nome Joe e vorrei tenerlo in considerazione. Per riuscirci, dobbiamo determinare se esiste una riga esistente con il suo nome e, in tal caso, aggiornarla per incrementare il conteggio; d'altra parte, se non esiste una riga esistente, dovremmo crearla.
MySQL utilizza la seguente sintassi: inserire ... sull'aggiornamento della chiave duplicato .... In questo caso:
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL: conteggio degli utenti per nome
Supponiamo di voler sapere quanti utenti hanno lo stesso nome. Cerchiamo di creare users
tabelle come segue:
create table users(
id serial,
name varchar(8) unique,
count int
);
Ora, abbiamo appena scoperto un nuovo utente di nome Joe e vorrei tenerlo in considerazione. Per riuscirci, dobbiamo determinare se esiste una riga esistente con il suo nome e, in tal caso, aggiornarla per incrementare il conteggio; d'altra parte, se non esiste una riga esistente, dovremmo crearla.
PostgreSQL usa la seguente sintassi: insert ... on conflict ... do update .... In questo caso:
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;