Recherche…
Introduction
MERGE (souvent aussi appelé UPSERT pour "update or insert") permet d'insérer de nouvelles lignes ou, si une ligne existe déjà, de mettre à jour la ligne existante. Le but est d'exécuter l'ensemble des opérations de manière atomique (pour garantir la cohérence des données) et d'éviter toute surcharge de communication pour plusieurs instructions SQL dans un système client / serveur.
MERGE pour faire la cible 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
;
Remarque: La partie AND NOT EXISTS
empêche la mise à jour des enregistrements qui n'ont pas changé. L'utilisation de la construction INTERSECT
permet de comparer les colonnes nullables sans traitement spécial.
MySQL: compter les utilisateurs par nom
Supposons que nous voulons savoir combien d'utilisateurs ont le même nom. Laissez-nous créer des users
table comme suit:
create table users(
id int primary key auto_increment,
name varchar(8),
count int,
unique key name(name)
);
Maintenant, nous venons de découvrir un nouvel utilisateur nommé Joe et aimerions le prendre en compte. Pour ce faire, nous devons déterminer s'il existe une ligne existante avec son nom et, le cas échéant, la mettre à jour pour incrémenter le nombre; d'autre part, s'il n'y a pas de ligne existante, nous devrions la créer.
MySQL utilise la syntaxe suivante: insert… on duplicate key update… . Dans ce cas:
insert into users(name, count)
values ('Joe', 1)
on duplicate key update count=count+1;
PostgreSQL: compter les utilisateurs par nom
Supposons que nous voulons savoir combien d'utilisateurs ont le même nom. Laissez-nous créer des users
table comme suit:
create table users(
id serial,
name varchar(8) unique,
count int
);
Maintenant, nous venons de découvrir un nouvel utilisateur nommé Joe et aimerions le prendre en compte. Pour ce faire, nous devons déterminer s'il existe une ligne existante avec son nom et, le cas échéant, la mettre à jour pour incrémenter le nombre; d'autre part, s'il n'y a pas de ligne existante, nous devrions la créer.
PostgreSQL utilise la syntaxe suivante: insert… on conflict… met à jour… . Dans ce cas:
insert into users(name, count)
values('Joe', 1)
on conflict (name) do update set count = users.count + 1;