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
- Construye las filas candidatas relacionando origen y destino con
ON. - Clasifica cada candidata como coincidente o no coincidente.
- Evalúa las cláusulas
WHENen el orden escrito. - 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:
| Origen | producto_id | stock |
|---|---|---|
| inventario | 1 | 8 |
| inventario | 2 | 4 |
| novedades_stock | 2 | 7 |
| novedades_stock | 3 | 5 |
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);| producto_id | stock | acción |
|---|---|---|
| 1 | 8 | Sin cambios |
| 2 | 7 | Actualizado |
| 3 | 5 | Insertado |
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
SELECTcon 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.
SELECT producto_id, COUNT(*) AS apariciones
FROM novedades_stock
GROUP BY producto_id
HAVING COUNT(*) > 1;Comprueba lo aprendido
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.
LEFT JOIN con el destino.INSERT.UNION ALL las filas del destino ausentes en el origen.Solución razonada
WITH destino(codigo, stock) AS (
VALUES ('A', 2), ('B', 4)
), origen(codigo, stock) AS (
VALUES ('B', 7), ('C', 5)
)
SELECT o.codigo,
CASE WHEN d.codigo IS NULL THEN 'INSERT'
ELSE 'UPDATE' END AS accion
FROM origen AS o
LEFT JOIN destino AS d ON d.codigo = o.codigo
UNION ALL
SELECT d.codigo, 'SIN CAMBIOS'
FROM destino AS d
LEFT JOIN origen AS o ON o.codigo = d.codigo
WHERE o.codigo IS NULL
ORDER BY 1;| codigo | accion |
|---|---|
| A | SIN CAMBIOS |
| B | UPDATE |
| C | INSERT |
La consulta no modifica datos: permite revisar la clasificación que después expresará MERGE. Antes de ejecutar la sentencia real, comprueba además que el origen no contenga varias filas para una misma clave.
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
MERGErelaciona origen y destino antes de elegir una acción.- El orden de las cláusulas
WHENpuede afectar al resultado. - La clave de coincidencia debe ser inequívoca.
- Las alternativas de UPSERT no son equivalentes a todas las formas de
MERGE.