La instrucción UPSERT (una combinación de "UPDATE" y "INSERT") es una operación que permite insertar una nueva fila en una tabla si no existe, o actualizarla si ya existe. En SQL, esta operación se puede realizar utilizando la instrucción MERGE. Esta es una herramienta poderosa para manejar situaciones en las que se necesita mantener datos actualizados sin duplicar registros.

Conceptos Clave

  • UPSERT: Operación que combina la inserción y actualización de datos.
  • MERGE: Instrucción SQL que permite realizar operaciones UPSERT.
  • Fuente (Source): Datos que se desean insertar o actualizar.
  • Destino (Target): Tabla en la que se desea realizar la operación.

Sintaxis Básica de MERGE

La sintaxis básica de la instrucción MERGE es la siguiente:

MERGE INTO target_table AS target
USING source_table AS source
ON target.matching_column = source.matching_column
WHEN MATCHED THEN
    UPDATE SET target.column1 = source.column1, target.column2 = source.column2
WHEN NOT MATCHED THEN
    INSERT (column1, column2) VALUES (source.column1, source.column2);

Explicación de la Sintaxis

  • MERGE INTO target_table AS target: Especifica la tabla de destino en la que se realizará la operación.
  • USING source_table AS source: Especifica la tabla de origen que contiene los datos que se desean insertar o actualizar.
  • ON target.matching_column = source.matching_column: Define la condición de coincidencia entre las tablas de origen y destino.
  • WHEN MATCHED THEN UPDATE SET ...: Define las acciones a realizar cuando se encuentra una coincidencia.
  • WHEN NOT MATCHED THEN INSERT ...: Define las acciones a realizar cuando no se encuentra una coincidencia.

Ejemplo Práctico

Supongamos que tenemos dos tablas: productos y nuevos_productos. Queremos actualizar los precios de los productos existentes y agregar nuevos productos a la tabla productos.

Estructura de las Tablas

CREATE TABLE productos (
    id INT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10, 2)
);

CREATE TABLE nuevos_productos (
    id INT,
    nombre VARCHAR(100),
    precio DECIMAL(10, 2)
);

Datos Iniciales

INSERT INTO productos (id, nombre, precio) VALUES
(1, 'Producto A', 10.00),
(2, 'Producto B', 20.00);

INSERT INTO nuevos_productos (id, nombre, precio) VALUES
(2, 'Producto B', 25.00),
(3, 'Producto C', 15.00);

Instrucción MERGE

MERGE INTO productos AS p
USING nuevos_productos AS np
ON p.id = np.id
WHEN MATCHED THEN
    UPDATE SET p.precio = np.precio
WHEN NOT MATCHED THEN
    INSERT (id, nombre, precio) VALUES (np.id, np.nombre, np.precio);

Resultado

Después de ejecutar la instrucción MERGE, la tabla productos tendrá los siguientes datos:

SELECT * FROM productos;

-- Resultado:
-- id | nombre     | precio
-- 1  | Producto A | 10.00
-- 2  | Producto B | 25.00
-- 3  | Producto C | 15.00

Ejercicio Práctico

Ejercicio 1

Dada la siguiente tabla clientes y nuevos_clientes, realiza una operación UPSERT para actualizar los datos de los clientes existentes y agregar nuevos clientes.

Estructura de las Tablas

CREATE TABLE clientes (
    id INT PRIMARY KEY,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE nuevos_clientes (
    id INT,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

Datos Iniciales

INSERT INTO clientes (id, nombre, email) VALUES
(1, 'Juan Perez', '[email protected]'),
(2, 'Ana Gomez', '[email protected]');

INSERT INTO nuevos_clientes (id, nombre, email) VALUES
(2, 'Ana Gomez', '[email protected]'),
(3, 'Luis Martinez', '[email protected]');

Instrucción MERGE

Escribe la instrucción MERGE para realizar la operación UPSERT.

-- Escribe tu código aquí

Solución

MERGE INTO clientes AS c
USING nuevos_clientes AS nc
ON c.id = nc.id
WHEN MATCHED THEN
    UPDATE SET c.email = nc.email
WHEN NOT MATCHED THEN
    INSERT (id, nombre, email) VALUES (nc.id, nc.nombre, nc.email);

Resultado Esperado

Después de ejecutar la instrucción MERGE, la tabla clientes debería tener los siguientes datos:

SELECT * FROM clientes;

-- Resultado:
-- id | nombre       | email
-- 1  | Juan Perez   | [email protected]
-- 2  | Ana Gomez    | [email protected]
-- 3  | Luis Martinez| [email protected]

Conclusión

La instrucción MERGE es una herramienta poderosa en SQL que permite realizar operaciones UPSERT de manera eficiente. Al combinar la inserción y actualización de datos en una sola instrucción, se simplifica el manejo de datos y se mejora el rendimiento de las operaciones. Asegúrate de entender bien la sintaxis y las condiciones de coincidencia para utilizar MERGE de manera efectiva en tus proyectos.

Curso de SQL

Módulo 1: Introducción a SQL

Módulo 2: Consultas básicas de SQL

Módulo 3: Trabajando con múltiples tablas

Módulo 4: Filtrado avanzado de datos

Módulo 5: Manipulación de datos

Módulo 6: Funciones avanzadas de SQL

Módulo 7: Subconsultas y consultas anidadas

Módulo 8: Índices y optimización de rendimiento

Módulo 9: Transacciones y concurrencia

Módulo 10: Temas avanzados

Módulo 11: SQL en la práctica

Módulo 12: Proyecto final

© Copyright 2024. Todos los derechos reservados