Слияние (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 не знает деталей внутренней структуры значения, поэтому Обновить не имело бы смысла. Так что НАБОР
операция всегда установить или заменить семантика.
Смотрите также
- Присоединяйтесь, в частности:
использованная литература
- ^ PostgreSQL-учебник
- ^ опровергать sqlite.org посетил 6-6-2018
- ^ Справочник по Transact-SQL (ядро СУБД): MERGE (Transact-SQL)
- ^ MySQL :: Справочное руководство MySQL 5.1 :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax
- ^ Справочное руководство MySQL 5.1: 11.2.6 REPLACE Syntax
- ^ "Справочное руководство MySQL 5.5 :: 13.2.5 INSERT Syntax". Получено 29 октября 2013.
- ^ «SQL в понимании SQLite: INSERT». Получено 2012-09-27.
- ^ Страница PostgreSQL INSERT
- ^ "Новый CUBRID 9.0.0". Официальный блог CUBRID. 2012-10-30. Получено 2012-11-08.
- ^ CUBRID :: Операторы обработки данных :: Insert :: ON DUPLICATE KEY UPDATE Предложение
- ^ CUBRID :: Операторы обработки данных :: Заменить
- ^ "ВЫСОКИЕ ЦЕННОСТИ".
- ^ "UPSERT SELECT".
- ^ "MERGE INTO (Дельта озера на Databricks)".
- ^ «Заявление UPSERT (документация Apache Impala)».
- Сюй, Лео; Обе, Регина (18 мая 2008 г.). «Перекрестное сравнение SQL Server, MySQL и PostgreSQL». Журнал Postgres OnLine. Получено 8 октября 2010.
- Ходоров, Кристина; Майк Дирольф (сентябрь 2010 г.). MongoDB: полное руководство. О'Рейли. ISBN 978-1-449-38156-1.