stringtranslate.com

Fusionar (SQL)

Un sistema de gestión de bases de datos relacionales utiliza sentencias SQL MERGE (también llamadas upsertINSERT ) para insertar registros nuevos o UPDATEexistentes 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 .

Uso

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

Implementaciones

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.

Sinónimo

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]

Otras implementaciones no estándar

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 INTOIGNOREINSERT

SQLite funciona de manera similar. También admite un alias para compatibilidad con MySQL. [8]INSERT OR REPLACE INTOREPLACE 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 MATCHEDy 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 UPDATEREPLACE 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]

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 con una updateoperación. Esto updategenera un error si no se encuentra la clave. En la updateoperación es posible establecer el upsertindicador: 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 SEToperaciones 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 SEToperación siempre tiene una semántica de establecer o reemplazar .

Véase también

Referencias

  1. ^ "E.1. Release 15". Documentación de PostgreSQL . 13 de octubre de 2022. Archivado desde el original el 13 de octubre de 2022 . Consultado el 13 de octubre de 2022 .
  2. ^ "Upsert de PostgreSQL con la instrucción INSERT ON CONFLICT". Tutorial de PostgreSQL . Archivado desde el 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 desde el 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 INSERT" . Consultado el 29 de octubre de 2013 .
  8. ^ "SQL tal como lo entiende SQLite: INSERT" . Consultado el 27 de septiembre de 2012 .
  9. ^ Página INSERT de PostgreSQL
  10. ^ "Nuevo CUBRID 9.0.0". Blog oficial de CUBRID. 2012-10-30 . Consultado el 2012-11-08 .
  11. ^ CUBRID :: Sentencias de manipulación de datos :: Insertar :: Cláusula ON DUPLICATE KEY UPDATE
  12. ^ CUBRID :: Declaraciones de manipulación de datos :: Reemplazar
  13. ^ "UPSERT VALORES".
  14. ^ "UPSERT SELECCIONAR".
  15. ^ "FUSIONARSE EN (Delta Lake en Databricks)".
  16. ^ "Declaración UPSERT (Documentación de Apache Impala)".

Enlaces externos