Buscar..


Introducción

MERGE (a menudo también llamado UPSERT para "actualizar o insertar") permite insertar nuevas filas o, si ya existe una fila, actualizar la fila existente. El punto es realizar todo el conjunto de operaciones de forma atómica (para garantizar que los datos permanezcan consistentes), y para evitar la sobrecarga de comunicación para varias declaraciones SQL en un sistema cliente / servidor.

MERGE para hacer 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 evita la actualización de registros que no han cambiado. El uso de la construcción INTERSECT permite que las columnas anulables se comparen sin un manejo especial.

MySQL: contando usuarios por nombre

Supongamos que queremos saber cuántos usuarios tienen el mismo nombre. Vamos a crear users tablas de la siguiente manera:

create table users(
    id int primary key auto_increment,
    name varchar(8),
    count int,
    unique key name(name)
);

Ahora, acabamos de descubrir un nuevo usuario llamado Joe y nos gustaría tenerlo en cuenta. Para lograrlo, debemos determinar si existe una fila con su nombre y, de ser así, actualizarla para incrementar el conteo; por otro lado, si no hay una fila existente, deberíamos crearla.

MySQL usa la siguiente sintaxis: insertar ... en actualización de clave duplicada ... En este caso:

insert into users(name, count)
       values ('Joe', 1)
       on duplicate key update count=count+1;

PostgreSQL: contando usuarios por nombre

Supongamos que queremos saber cuántos usuarios tienen el mismo nombre. Vamos a crear users tablas de la siguiente manera:

create table users(
    id serial,
    name varchar(8) unique,
    count int
);

Ahora, acabamos de descubrir un nuevo usuario llamado Joe y nos gustaría tenerlo en cuenta. Para lograrlo, debemos determinar si existe una fila con su nombre y, de ser así, actualizarla para incrementar el conteo; por otro lado, si no hay una fila existente, deberíamos crearla.

PostgreSQL usa la siguiente sintaxis: insertar ... en conflicto ... actualizar ... En este caso:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow