Articulo de referencia

Combinar (SQL)

Un sistema de gestión de bases de datos relacionales utiliza sentencias SQL MERGE (también llamadas upsert ) para INSERTAR nuevos registros o ACTUALIZAR o ELIMINAR los existente...

Un sistema de gestión de bases de datos relacionales utiliza sentencias SQL MERGE (también llamadas upsert ) para INSERTAR nuevos registros o ACTUALIZAR o ELIMINAR los existentes, según se cumpla una condición . Esta funcionalidad se introdujo oficialmente en el estándar SQL:2003 y se amplió en el estándar SQL:2008 .

Uso

MERGE INTO tablename USING table_reference ON ( condition ) WHEN MATCHED THEN UPDATE SET column1 = value1 [ , column2 = value2 ... ] WHEN NOT MATCHED THEN INSERT ( column1 [ , column2 ... ] ) VALUES ( value1 [ , value2 ... ] );

Se emplea una unión derecha sobre el Destino (la tabla INTO ) y el Origen (la tabla/vista/subconsulta USING ), donde Destino es la tabla izquierda y Origen es la derecha. Las cuatro combinaciones posibles dan como resultado estas reglas:

  • Si el/ los campo(s) ON en el origen coincide(n) con el /los campo(s) ON en el destino, entonces ACTUALIZAR
  • Si el/ los campo(s) ON en el origen no coinciden con el /los campo(s) ON en el destino, entonces INSERT
  • Si el/los campo(s) ON no existe(n) en el origen pero sí existe(n) en el destino, entonces no se realiza ninguna acción.
  • Si el/los campo(s) ON no existen 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, se produce un error según los estándares SQL:2003 . No se puede actualizar una fila de destino varias veces con una instrucción MERGE.

Implementaciones

Los sistemas de gestión de bases de datos PostgreSQL , [ 1 ] Oracle Database , IBM Db2 , Teradata , EXASOL , Firebird , CUBRID , H2 , HSQLDB , MS SQL , MonetDB , Vectorwise y Apache Derby admiten la sintaxis estándar. Algunos también añaden extensiones SQL no estándar.

Sinónimo

Algunas implementaciones de bases de datos adoptaron el término upsert (una combinación de update e insert ) para referirse a una instrucción o conjunto de instrucciones que inserta un registro en una tabla si no existe o, si ya existe, actualiza el registro existente. Este sinónimo se utiliza en PostgreSQL (v9.5+) [ 2 ] y SQLite (v3.24+) [ 3 ] . También se usa para abreviar el pseudocódigo equivalente a "MERGE".

Se utiliza en Microsoft Azure SQL Database . [ 4 ]

Otras implementaciones no estándar

Otros sistemas de gestión de bases de datos admiten este comportamiento, o uno muy similar, mediante sus propias extensiones SQL no estándar.

MySQL , por ejemplo, admite el uso de la sintaxis [ 5 ] que puede utilizarse para lograr un efecto similar con la limitación de que la unión entre el destino y el origen debe realizarse únicamente sobre las restricciones PRIMARY KEY o UNIQUE, lo cual no es un requisito del 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. Además, existe una cláusula para la instrucción [ 7 ] que le indica al servidor que ignore los errores de "clave duplicada" y continúe (las filas existentes no se insertarán ni actualizarán, pero todas las filas nuevas se insertarán).INSERT...ONDUPLICATEKEYUPDATE>REPLACE INTOIGNOREINSERT

SQLite funciona de manera similar. También admite como alias para compatibilidad con MySQL. [ 8 ]INSERTORREPLACEINTOREPLACE INTO

Firebird admite la inserción MERGE INTO, pero no genera un error cuando hay varias filas de datos de origen. Además, existe una versión de una sola fila, pero esta no permite realizar acciones diferentes al insertar o actualizar (por ejemplo, establecer un nuevo valor de secuencia solo para las filas nuevas, no para las existentes).UPDATEORINSERTINTOtablename(columns)VALUES(values)[MATCHING(columns)]

IBM Db2 amplía la sintaxis con múltiples cláusulas WHEN MATCHEDAND WHEN NOT MATCHED, distinguiéndolas con ... AND some-conditionguardas .

Microsoft SQL Server se amplía con la compatibilidad con protecciones y también con la compatibilidad con LEFT JOIN mediante cláusulas.WHENNOTMATCHEDBYSOURCE

PostgreSQL admite la fusión desde la versión 15, pero anteriormente admitía la fusión a través de . [ 9 ]INSERTINTO...ONCONFLICT[conflict_target]conflict_action

CUBRID admite la instrucción MERGE INTO[ 10 ] . Y admite el uso de la sintaxis. [ 11 ] También admite la compatibilidad con MySQL. [ 12 ]INSERT...ONDUPLICATEKEYUPDATEREPLACE INTO

Apache Phoenix admite la sintaxis UPSERT VALUES[ 13 ] y UPSERT SELECT[ 14 ] .

Spark SQL admite UPDATE SET *cláusulas INSERT *en acciones. [ 15 ]

Apache Impala admite UPSERT INTO ... SELECT. [ 16 ]

Uso en NoSQL

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 mediante una updateoperación. Esta operación updategenera un error si no se encuentra la clave. En la updateoperación, es posible establecer un upsertindicador: en este caso, se almacena un nuevo valor asociado a la clave especificada si no existe; de ​​lo contrario, se reemplaza el valor completo.

En Redis, la SEToperación establece el valor asociado a una clave determinada. Redis desconoce los detalles de la estructura interna del valor, por lo que una actualización carecería de sentido. Por lo tanto, la SEToperación siempre tiene una semántica de establecer o reemplazar .

Véase también

Referencias

  1. "E.1. Versión 15" . Documentación de PostgreSQL . 13 de octubre de 2022. Archivado del original el 13 de octubre de 2022. Consultado el 13 de octubre de 2022 .
  2. "Insertar o actualizar datos en PostgreSQL usando la instrucción INSERT ON CONFLICT" . Tutorial de PostgreSQL . Archivado del original el 28 de noviembre de 2022.
  3. " upsert ", SQLite, visitado el 6-6-2018.
  4. "MERGE (Transact-SQL)" . Referencia de Transact-SQL (Motor de base de datos) . Microsoft Learn. Archivado del original el 24 de junio de 2016.
  5. MySQL  :: Manual de referencia de MySQL 5.1  :: 12.2.4.3 Sintaxis de INSERT ... ON DUPLICATE KEY UPDATE
  6. Manual de referencia de MySQL 5.1: 11.2.6 Sintaxis de REPLACE
  7. "Manual de referencia de MySQL 5.5 :: 13.2.5 Sintaxis de INSERT" . Consultado el 29 de octubre de 2013 . 
  8. "SQL tal como lo entiende SQLite: INSERTAR" . Consultado el 27 de septiembre de 2012 .
  9. Página de inserción de PostgreSQL
  10. "Nuevo CUBRID 9.0.0" . Blog oficial de CUBRID. 30/10/2012 . Consultado el 08/11/2012 .
  11. CUBRID  :: Instrucciones de manipulación de datos  :: Insertar  :: Cláusula ON DUPLICATE KEY UPDATE
  12. CUBRID  :: Instrucciones de manipulación de datos  :: Reemplazar
  13. "UPSERT VALUES" .
  14. "UPSERT SELECT" .
  15. "FUSIONAR EN (Delta Lake en Databricks)" .
  16. "Instrucció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" . Postgres OnLine Journal . Recuperado 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.
  • Documentación de Oracle 11g Release 2 sobreMERGE
  • Documentación de Firebird 2.1 sobreMERGE
  • Sentencia MERGE de DB2 v9
  • Documentación de Microsoft SQL Server
  • Sentencias de modificación de datos de HSQLdb 2.0
  • Página de sintaxis SQL H2 (1.2)