Un sistema de gestión de bases de datos relacionales utiliza sentencias SQL MERGE
(también llamadas upsertINSERT
) para insertar registros nuevos o UPDATE
existentes DELETE
, dependiendo de si la condición coincide. Se introdujo oficialmente en el estándar SQL:2003 y se amplió [ cita requerida ] en el estándar SQL:2008 .
FUSIONAR EN nombre_tabla USANDO referencia_tabla ON ( condición ) CUANDO COINCIDE ENTONCES ACTUALIZAR ESTABLECER columna1 = valor1 [ , columna2 = valor2 ... ] CUANDO NO COINCIDE ENTONCES INSERTAR ( columna1 [ , columna2 ... ] ) VALORES ( valor1 [ , valor2 ... ] );
Se utiliza una unión derecha sobre la tabla de destino (la tabla INTO) y la tabla de origen (la tabla/vista/subconsulta USING), donde la tabla de destino es la tabla de la izquierda y la tabla de origen es la de la derecha. Las cuatro combinaciones posibles dan como resultado estas reglas:
Si varias filas de origen coinciden con una fila de destino determinada, se genera un error de acuerdo con los estándares SQL:2003. No se puede actualizar una fila de destino varias veces con una instrucción MERGE
Los sistemas de gestión de bases de datos PostgreSQL , [1] Oracle Database , IBM Db2 , Teradata , EXASOL , Firebird , CUBRID , H2 , HSQLDB , MS SQL , Vectorwise y Apache Derby admiten la sintaxis estándar. Algunos también añaden extensiones SQL no estándar.
Algunas implementaciones de bases de datos adoptaron el término " Upsert " (un acrónimo de update e insert ) para una sentencia de base de datos , o una combinación de sentencias, que inserta un registro en una tabla de una base de datos si el registro no existe o, si el registro ya existe, actualiza el registro existente. Este sinónimo se utiliza en PostgreSQL (v9.5+) [2] y SQLite (v3.24+). [3] También se utiliza para abreviar el pseudocódigo equivalente a "MERGE".
Se utiliza en la base de datos SQL de Microsoft Azure . [4]
Algunos otros sistemas de gestión de bases de datos admiten este comportamiento, o uno muy similar, a través de sus propias extensiones SQL no estándar.
MySQL , por ejemplo, admite el uso de la sintaxis [5] que se puede utilizar para lograr un efecto similar con la limitación de que la unión entre el destino y la fuente debe realizarse solo con restricciones PRIMARY KEY o UNIQUE, lo que no se requiere en el estándar ANSI/ISO. También admite la sintaxis [6] que primero intenta una inserción y, si falla, elimina la fila, si existe, y luego inserta la nueva. También hay una cláusula para la declaración [7] que le dice al servidor que ignore los errores de "clave duplicada" y continúe (las filas existentes no se insertarán ni actualizarán, pero se insertarán todas las filas nuevas).INSERT ... ON DUPLICATE KEY UPDATE
>REPLACE INTO
IGNORE
INSERT
SQLite funciona de manera similar. También admite un alias para compatibilidad con MySQL. [8]INSERT OR REPLACE INTO
REPLACE INTO
Firebird admite MERGE INTO
, sin embargo, no genera un error cuando hay varias filas de datos de origen. Además, existe una versión de una sola fila, pero esta última no le brinda la opción de realizar acciones diferentes en la inserción y la actualización (por ejemplo, establecer un nuevo valor de secuencia solo para las filas nuevas, no para las existentes).UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
IBM Db2 extiende la sintaxis con múltiples cláusulas WHEN MATCHED
y WHEN NOT MATCHED
, distinguiéndolas con ... AND some-condition
guardias .
Microsoft SQL Server se extiende con soporte de protecciones y también con soporte de unión izquierda a través de cláusulas.WHEN NOT MATCHED BY SOURCE
PostgreSQL admite la fusión desde la versión 15, pero anteriormente admitía la fusión mediante . [9]INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
CUBRID admite la declaración MERGE INTO
[10] y el uso de la sintaxis [11 ]. También es compatible con MySQL. [12]INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
Apache Phoenix admite la sintaxis UPSERT VALUES
[13] y UPSERT SELECT
[14] .
Spark SQL admite cláusulas UPDATE SET *
y INSERT *
en acciones. [15]
Apache Impala es compatible con UPSERT INTO ... SELECT
. [16]
Un concepto similar se aplica en algunas bases de datos NoSQL .
En MongoDB, los campos de un valor asociado a una clave se pueden actualizar con una update
operación. Esto update
genera un error si no se encuentra la clave. En la update
operación es posible establecer el upsert
indicador: en este caso, se almacena un nuevo valor asociado a la clave dada si no existe; de lo contrario, se reemplaza todo el valor.
En Redis, las SET
operaciones establecen el valor asociado a una clave determinada. Redis no conoce ningún detalle de la estructura interna del valor, por lo que una actualización no tendría sentido. Por lo tanto, la SET
operación siempre tiene una semántica de establecer o reemplazar .
MERGE
MERGE