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;


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow