Un sistema de administración de bases de datos relacionales usa declaraciones SQL MERGE
(también llamadas upsert ) para INSERT
registros nuevos o UPDATE
registros existentes, dependiendo de si la condición coincide. Se introdujo oficialmente en el estándar SQL: 2003 y se expandió en el estándar SQL: 2008 .
Uso
FUSIÓN EN tablename USING table_reference ON ( condición ) CUANDO SE PAREJA ENTONCES ACTUALIZACIÓN DE CONJUNTO column1 = valor1 [ , columna2 = valor2 ... ] CUANDO NO EMPAREJA ENTONCES INSERT ( column1 [ , columna2 ... ] ) VALORES ( valor1 [ , valor2 ... ] );
Se emplea una combinación derecha sobre el destino (la tabla INTO) y el origen (la tabla / vista / subconsulta USING), donde el destino es la tabla de la izquierda y el origen es la derecha. Las cuatro combinaciones posibles producen estas reglas:
- Si los campos ON en la Fuente coinciden con los campos ON en el Destino, ACTUALIZAR
- Si el (los) campo (s) ACTIVADO (s) en la Fuente no coincide con el (los) campo (s) ACTIVADO en el Destino, entonces INSERTAR
- Si el (los) campo (s) ACTIVADO (s) no existen en el origen pero sí en el destino, no se realiza ninguna acción.
- Si el (los) campo (s) ON no existe ni en el origen ni en el destino, no se realiza ninguna acción.
Si varias filas de origen coinciden con una fila de destino determinada, los estándares SQL: 2003 imponen un error. No puede actualizar una fila de destino varias veces con una instrucción MERGE
Implementaciones
Los sistemas de gestión de bases de datos Oracle Database , DB2 , Teradata , EXASOL , Firebird , CUBRID , H2 , HSQLDB , MS SQL , Vectorwise y Apache Derby admiten la sintaxis estándar. Algunos también agregan extensiones SQL no estándar.
Sinónimo
Algunas implementaciones de bases de datos adoptaron el término " Upsert " (un acrónimo de actualización y de inserción ) a una base de datos de la declaración, o una combinación de los estados, que inserta un registro a una tabla en 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 +) [1] y SQLite (v3.24 +). [2] También se utiliza para abreviar el pseudocódigo equivalente "MERGE".
Se utiliza en Microsoft SQL Azure . [3]
Otras implementaciones no estándar
Algunos otros sistemas de administración de bases de datos admiten este comportamiento, o muy similar, a través de sus propias extensiones SQL no estándar.
MySQL , por ejemplo, admite el uso de la sintaxis [4] 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 en restricciones PRIMARY KEY o UNIQUE, que no se requieren en la Estándar ANSI / ISO. También es compatible con la sintaxis, [5] 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, [6] 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 's funciona de manera similar. También admite como alias para compatibilidad con MySQL. [7]INSERT OR REPLACE INTO
REPLACE INTO
Firebird admite, MERGE INTO
aunque no arroja un error cuando hay varias filas de datos de origen. Además, hay una versión de una sola fila , pero esta última no le da la opción de realizar diferentes acciones en la inserción frente a la actualización (por ejemplo, establecer un nuevo valor de secuencia solo para nuevas filas, no para las existentes).UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
IBM DB2 amplía 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 protectores de soporte y también con Left Join a través de cláusulas.WHEN NOT MATCHED BY SOURCE
PostgreSQL admite la fusión a través de . [8]INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
CUBRID admite la declaración MERGE INTO
[9] . Y admite el uso de sintaxis. [10] También es compatible con MySQL. [11]INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
Apache Phoenix admite la sintaxis UPSERT VALUES
[12] y UPSERT SELECT
[13] .
Spark SQL admite UPDATE SET *
y INSERT *
cláusulas en acciones. [14]
Soporta Apache ImpalaUPSERT INTO ... SELECT
. [15]
Uso en NoSQL
Se aplica un concepto similar en algunas bases de datos NoSQL .
Por ejemplo, en MongoDB, los campos de un valor asociado con una clave se pueden actualizar con una update
operación. El update
genera un error si no se encuentra la clave. En la update
operación es posible poner la upsert
bandera: en este caso se almacena un nuevo valor asociado a la clave dada si no existe, de lo contrario se reemplaza el valor completo.
En Redis, las SET
operaciones establecen el valor asociado con 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. Entonces, la SET
operación siempre tiene una semántica de conjunto o reemplazo .
Ver también
- Únase en particular:
- Unirse (SQL)
- unirse (Unix)
Referencias
- ^ Tutorial de PostgreSQL
- ^ upsert sqlite.org visitado el 6 de junio de 2018
- ^ Referencia de Transact-SQL (motor de base de datos): MERGE (Transact-SQL)
- ^ MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 Sintaxis INSERT ... ON DUPLICATE KEY UPDATE
- ^ Manual de referencia de MySQL 5.1: 11.2.6 REEMPLAZAR Sintaxis
- ^ "Manual de referencia de MySQL 5.5 :: 13.2.5 INSERT Syntax" . Consultado el 29 de octubre de 2013 .
- ^ "SQL entendido por SQLite: INSERT" . Consultado el 27 de septiembre de 2012 .
- ^ Página INSERT de PostgreSQL
- ^ "Nuevo CUBRID 9.0.0" . Blog Oficial de CUBRID. 2012-10-30 . Consultado el 8 de noviembre de 2012 .
- ^ CUBRID :: Declaraciones de manipulación de datos :: Insertar :: Cláusula ON DUPLICATE KEY UPDATE
- ^ CUBRID :: Declaraciones de manipulación de datos :: Reemplazar
- ^ "VALORES UPSERT" .
- ^ "UPSERT SELECT" .
- ^ "FUSIÓN EN (Delta Lake en Databricks)" .
- ^ "Declaración UPSERT (Documentación de Apache Impala)" .
- Hsu, Leo; Obe, Regina (18 de mayo de 2008). "Comparación cruzada de SQL Server, MySQL y PostgreSQL" . Publicación en línea de Postgres . Consultado el 8 de octubre de 2010 .
- Chodorow, Kristina; Mike Dirolf (septiembre de 2010). MongoDB: la guía definitiva . O'Reilly . ISBN 978-1-449-38156-1.
enlaces externos
- Documentación de Oracle 11g versión 2 sobre MERGE
- Documentación de Firebird 2.1 sobre MERGE
- Sentencia DB2 v9 MERGE
- Documentación de Microsoft SQL Server
- Declaraciones de cambio de datos de HSQLdb 2.0
- H2 (1.2) página de sintaxis SQL