Слияние (SQL) - Merge (SQL)

А система управления реляционной базой данных использует SQL ОБЪЕДИНЕНИЕ (также называется опровергать) заявления к ВСТАВИТЬ новые записи или ОБНОВИТЬ существующие записи в зависимости от того, состояние совпадения. Он был официально представлен в SQL: 2003 стандарт и расширен в SQL: 2008 стандарт.

Применение

ОБЪЕДИНЕНИЕВимя таблицыС ПОМОЩЬЮtable_referenceНА(состояние)КОГДАПОДЧИНЕННЫЙТОГДАОБНОВИТЬНАБОРcolumn1=значение1[, столбец2 = значение2 ...]КОГДАНЕПОДЧИНЕННЫЙТОГДАВСТАВИТЬ(column1[, столбец2 ...])ЦЕННОСТИ(значение1[, значение2 ...]);

А право присоединиться используется над Target (таблица INTO) и Source (таблица USING / представление / подзапрос) - где Target - это левая таблица, а Source - правая. Четыре возможных комбинации дают следующие правила:

  • Если поле (поля) ON в источнике совпадает с полем ON в Target, то UPDATE
  • Если поле (поля) ON в источнике не совпадает с полем ON в Target, то INSERT
  • Если поле (поля) ON не существует в источнике, но существует в целевом объекте, то никаких действий не выполняется.
  • Если поле (поля) ON не существует ни в источнике, ни в цели, никакие действия не выполняются.

Если несколько исходных строк соответствуют заданной целевой строке, в соответствии со стандартами SQL: 2003 возникает ошибка. Вы не можете обновить целевую строку несколько раз с помощью оператора MERGE

Реализации

Системы управления базами данных База данных Oracle, DB2, Терадата, EXASOL, Жар-птица, Кубрид, HSQLDB, MS SQL, Vectorwise и Apache Derby поддерживают стандартный синтаксис. Некоторые также добавляют нестандартные расширения SQL.

Синоним

Некоторые реализации баз данных приняли термин "Upsert"(а чемодан из Обновить и вставить) к база данных оператор или комбинация операторов, который вставляет запись в таблицу в базе данных, если запись не существует, или, если запись уже существует, обновляет существующую запись. Этот синоним используется в PostgreSQL (Версия 9.5 +)[1] и SQLite (v3.24 +).[2] Он также используется для сокращения псевдокода, эквивалентного «MERGE».

Он используется в Microsoft SQL Azure.[3]

Другие нестандартные реализации

Некоторые другие системы управления базами данных поддерживают это или очень похожее поведение с помощью собственных нестандартных расширений SQL.

MySQL, например, поддерживает использование ВСТАВИТЬ ... НА ДУБЛИКАЦИЯ КЛЮЧ ОБНОВИТЬ синтаксис[4] который можно использовать для достижения аналогичного эффекта с ограничением, что соединение между целью и источником должно выполняться только с ограничениями PRIMARY KEY или UNIQUE, что не требуется в стандарте ANSI / ISO. Он также поддерживает ЗАМЕНИТЬ НА синтаксис,[5] который сначала пытается вставить, и если это не удается, удаляет строку, если она существует, а затем вставляет новую. Также есть ИГНОРИРОВАТЬ пункт для ВСТАВИТЬ заявление,[6] который сообщает серверу игнорировать ошибки «дублированного ключа» и продолжать (существующие строки не будут вставлены или обновлены, но будут вставлены все новые строки).

SQLite с ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ В работает аналогично. Он также поддерживает ЗАМЕНИТЬ НА как псевдоним для совместимости с MySQL.[7]

Жар-птица поддерживает СЛИЯТЬСЯ В хотя не может вызвать ошибку при наличии нескольких строк исходных данных. Дополнительно есть однорядный вариант, ОБНОВИТЬ ИЛИ ВСТАВИТЬ В имя таблицы (столбцы) ЦЕННОСТИ (ценности) [МАТЧИКИ (столбцы)], но последнее не дает вам возможности выполнять разные действия при вставке и обновлении (например, установка нового значения последовательности только для новых строк, а не для существующих).

IBM DB2 расширяет синтаксис несколькими При совпадении и КОГДА НЕ СООТВЕТСТВУЕТ статей, различая их ... И какое-то условие охранники.

Microsoft SQL Server расширяется с поддерживающими ограждениями, а также с поддерживающим левым соединением через КОГДАНЕПОДЧИНЕННЫЕОТИСТОЧНИК статьи.

PostgreSQL поддерживает слияние через ВСТАВИТЬ В ... НА КОНФЛИКТ [ конфликт_целевой ] конфликт_action.[8]

Кубрид поддерживает СЛИЯТЬСЯ В[9] заявление. И поддерживает использование ВСТАВИТЬ ... НА ДУБЛИКАЦИЯ КЛЮЧ ОБНОВИТЬ синтаксис.[10] Он также поддерживает ЗАМЕНИТЬ НА для совместимости с MySQL.[11]

Apache Phoenix поддерживает УВЕЛИЧИТЬ ЗНАЧЕНИЯ[12] и UPSERT SELECT[13] синтаксис.

Spark SQL поддерживает НАБОР ОБНОВЛЕНИЙ * и ВСТАВИТЬ * статьи в действиях.[14]

Apache Impala поддерживает UPSERT INTO ... SELECT[15].

Использование в NoSQL

Подобная концепция применяется в некоторых NoSQL базы данных.

Например. в MongoDB поля в значении, связанном с ключом, могут быть обновлены с помощью Обновить операция. В Обновить выдает ошибку, если ключ не найден. Обновить операции можно установить опровергать flag: в этом случае сохраняется новое значение, связанное с данным ключом, если оно не существует, в противном случае заменяется все значение.

В Redis то НАБОР операции устанавливает значение, связанное с данным ключом. Redis не знает деталей внутренней структуры значения, поэтому Обновить не имело бы смысла. Так что НАБОР операция всегда установить или заменить семантика.

Смотрите также

использованная литература

  1. ^ PostgreSQL-учебник
  2. ^ опровергать sqlite.org посетил 6-6-2018
  3. ^ Справочник по Transact-SQL (ядро СУБД): MERGE (Transact-SQL)
  4. ^ MySQL :: Справочное руководство MySQL 5.1 :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax
  5. ^ Справочное руководство MySQL 5.1: 11.2.6 REPLACE Syntax
  6. ^ "Справочное руководство MySQL 5.5 :: 13.2.5 INSERT Syntax". Получено 29 октября 2013.
  7. ^ «SQL в понимании SQLite: INSERT». Получено 2012-09-27.
  8. ^ Страница PostgreSQL INSERT
  9. ^ "Новый CUBRID 9.0.0". Официальный блог CUBRID. 2012-10-30. Получено 2012-11-08.
  10. ^ CUBRID :: Операторы обработки данных :: Insert :: ON DUPLICATE KEY UPDATE Предложение
  11. ^ CUBRID :: Операторы обработки данных :: Заменить
  12. ^ "ВЫСОКИЕ ЦЕННОСТИ".
  13. ^ "UPSERT SELECT".
  14. ^ "MERGE INTO (Дельта озера на Databricks)".
  15. ^ «Заявление UPSERT (документация Apache Impala)».

внешние ссылки