Modificar datos · sincronización avanzada

MERGE

Compara una fuente con una tabla de destino y ejecuta una acción según exista o no una coincidencia.

Lectura: 7–9 minEjemplo razonadoDiferencias por motor
Contenido de esta guía

Qué problema resuelve MERGE

MERGE sincroniza una tabla de destino con un conjunto de datos de origen. Primero relaciona ambas partes mediante una condición y después evalúa cláusulas WHEN para decidir si actualiza, inserta o, cuando el motor y la regla lo permiten, elimina.

Es más amplio que un simple «insertar o actualizar»: puede describir varias acciones en una sola sentencia. Esa potencia exige que la condición de coincidencia sea estable y no ambigua.

Cómo toma la decisión

  1. Construye las filas candidatas relacionando origen y destino con ON.
  2. Clasifica cada candidata como coincidente o no coincidente.
  3. Evalúa las cláusulas WHEN en el orden escrito.
  4. Ejecuta la primera acción aplicable para esa fila.

La condición ON define la identidad de la sincronización. Debe comparar una clave que identifique de forma inequívoca la fila de destino. No la uses como un filtro general de actualización.

Ejemplo razonado: actualizar inventario

Supón que inventario contiene los productos actuales y novedades_stock trae una fotografía nueva:

Datos antes de MERGE
Origenproducto_idstock
inventario18
inventario24
novedades_stock27
novedades_stock35
Ejemplo con sintaxis de PostgreSQL
MERGE INTO inventario AS destino
USING novedades_stock AS origen
ON destino.producto_id = origen.producto_id
WHEN MATCHED THEN
  UPDATE SET stock = origen.stock
WHEN NOT MATCHED THEN
  INSERT (producto_id, stock)
  VALUES (origen.producto_id, origen.stock);
Resultado esperado
producto_idstockacción
18Sin cambios
27Actualizado
35Insertado

El producto 2 coincide y se actualiza. El producto 3 no existe en el destino y se inserta. El producto 1 no aparece en el origen y permanece igual porque la sentencia no incluye una acción para «no coincidente por origen».

Comprobaciones antes de ejecutar

  • Ejecuta primero un SELECT con la misma unión para revisar las coincidencias.
  • Comprueba que el origen no tenga dos filas para la misma clave de destino.
  • Prueba con pocos datos y dentro de una transacción cuando el motor lo permita.
  • Revisa disparadores, restricciones y acciones de borrado que puedan ampliar el efecto.
  • Define cómo comprobarás el resultado: filas afectadas, valores finales y filas del destino que no aparecen en el origen.

Error frecuente

Permitir varias filas de origen para la misma fila de destino

Si dos filas del origen coinciden con un único producto de destino, la actualización deja de ser una decisión inequívoca y el motor puede rechazar la operación. Deduplica o agrega la fuente antes del MERGE y utiliza una clave única para la condición.

Comprobación previa
SELECT producto_id, COUNT(*) AS apariciones
FROM novedades_stock
GROUP BY producto_id
HAVING COUNT(*) > 1;

Comprueba lo aprendido

Intermedia · clasificación verificable

Simula las acciones antes de modificar

El destino contiene A y B; el origen contiene B y C. Escribe una consulta de solo lectura que clasifique cada código como UPDATE, INSERT o SIN CAMBIOS.

Compatibilidad y alternativas

PostgreSQL, SQL Server y Oracle disponen de MERGE, pero su sintaxis, acciones disponibles y restricciones no son idénticas. MySQL utiliza mecanismos como INSERT ... ON DUPLICATE KEY UPDATE para ciertos casos de inserción o actualización. SQLite ofrece INSERT ... ON CONFLICT como UPSERT. Estas alternativas dependen de una clave única y no sustituyen todas las posibilidades de un MERGE completo.

Este ejemplo se ha contrastado con documentación oficial de PostgreSQL, pero no se ejecutó en el laboratorio local del sitio porque ese laboratorio utiliza SQLite, que no implementa la sentencia MERGE.

Qué debes recordar

  • MERGE relaciona origen y destino antes de elegir una acción.
  • El orden de las cláusulas WHEN puede afectar al resultado.
  • La clave de coincidencia debe ser inequívoca.
  • Las alternativas de UPSERT no son equivalentes a todas las formas de MERGE.

Conceptos relacionados

Fuentes técnicas consultadas