Система управления реляционной базой данных использует операторы SQL MERGE
(также называемые upsert ) для INSERT
новых или UPDATE
существующих записей в зависимости от того, соответствует ли условие . Он был официально представлен в стандарте SQL: 2003 и расширен в стандарте SQL: 2008 .
Применение
MERGE INTO tablename ИСПОЛЬЗУЯ table_reference ON ( условие ) КОГДА СОГЛАСИЕ ТО ОБНОВЛЕНИЕ УСТАНОВИТЬ столбец1 = значение1 [ , столбец2 = значение2 ... ] КОГДА НЕ СООТВЕТСТВУЕТ ТО ВСТАВИТЬ ( столбец1 [ , столбец2 ... ] ) ЗНАЧЕНИЯ ( значение1 [ , значение2 ... ] );
RIGHT JOIN используется над Target (таблица INTO) и источник ( с помощью таблицы / просмотр / суб-запрос) - где Target является левой таблицей и источником является правильной. Четыре возможных комбинации дают следующие правила:
- Если поле (поля) ON в источнике совпадает с полем ON в Target, то UPDATE
- Если поля ON в источнике не совпадают с полями ON в Target, тогда INSERT
- Если поле (поля) ON не существует в источнике, но существует в целевом объекте, то никакие действия не выполняются.
- Если поля ON не существуют ни в источнике, ни в цели, никакие действия не выполняются.
Если несколько исходных строк соответствуют заданной целевой строке, в соответствии со стандартами SQL: 2003 возникает ошибка. Вы не можете обновить целевую строку несколько раз с помощью оператора MERGE
Реализации
Системы управления базами данных Oracle Database , DB2 , Teradata , EXASOL , Firebird , CUBRID , H2 , HSQLDB , MS SQL , Vectorwise и Apache Derby поддерживают стандартный синтаксис. Некоторые также добавляют нестандартные расширения SQL.
Синоним
Некоторые реализации базы данных были принята термином « Upsert » (а чемодан из обновления и вставки ) к базе данных оператора или комбинации операторов, которые вставляют запись в таблицу в базе данных , если запись не существует или, если запись уже существует , обновляет существующую запись. Этот синоним используется в PostgreSQL (v9.5 +) [1] и SQLite (v3.24 +). [2] Он также используется для сокращения псевдокода, эквивалентного «MERGE».
Он используется в Microsoft SQL Azure . [3]
Другие нестандартные реализации
Некоторые другие системы управления базами данных поддерживают это или очень похожее поведение с помощью собственных нестандартных расширений SQL.
MySQL , например, поддерживает использование синтаксиса [4], который может использоваться для достижения аналогичного эффекта с ограничением, что соединение между целью и источником должно выполняться только с ограничениями PRIMARY KEY или UNIQUE, что не требуется в Стандарт ANSI / ISO. Он также поддерживает синтаксис [5], который сначала пытается вставить, а если это не удается, удаляет строку, если она существует, а затем вставляет новую. Также есть пункт для оператора [6], который предписывает серверу игнорировать ошибки «дублирования ключа» и продолжать (существующие строки не будут вставлены или обновлены, но будут вставлены все новые строки).INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
IGNORE
INSERT
SQLite «s работает аналогично. Он также поддерживается как псевдоним для совместимости с MySQL. [7]INSERT OR REPLACE INTO
REPLACE INTO
Firebird поддерживает, MERGE INTO
но не может выдать ошибку при наличии нескольких строк исходных данных. Кроме того, существует версия с одной строкой , но последняя не дает вам возможности выполнять различные действия при вставке и обновлении (например, установка нового значения последовательности только для новых строк, а не для существующих).UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
IBM DB2 расширяет синтаксис с многократными WHEN MATCHED
и WHEN NOT MATCHED
пунктами, отличающие их с ... AND some-condition
охранниками .
Microsoft SQL Server расширяется с помощью вспомогательных средств защиты, а также с помощью предложений Left Join via .WHEN NOT MATCHED BY SOURCE
PostgreSQL поддерживает слияние через . [8]INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
CUBRID поддерживает оператор MERGE INTO
[9] . И поддерживает использование синтаксиса. [10] Он также поддерживает совместимость с MySQL. [11]INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
Apache Phoenix поддерживает синтаксис UPSERT VALUES
[12] и UPSERT SELECT
[13] .
Spark SQL поддерживает предложения UPDATE SET *
и INSERT *
предложения в действиях. [14]
Apache Impala поддерживает UPSERT INTO ... SELECT
. [15]
Использование в NoSQL
Похожая концепция применяется в некоторых базах данных NoSQL .
Например, в MongoDB поля значения, связанного с ключом, могут быть обновлены с помощью update
операции. update
Выдает ошибку , если ключ не найден. В update
операции можно установить upsert
флаг: в этом случае сохраняется новое значение, связанное с данным ключом, если оно не существует, в противном случае заменяется все значение.
В Redis на SET
операции задает значение , связанное с данным ключом. Redis не знает деталей внутренней структуры значения, поэтому обновление не имеет смысла. Таким образом, SET
операция всегда имеет семантику установки или замены .
Смотрите также
- Присоединяйтесь, в частности:
- Присоединиться (SQL)
- присоединиться (Unix)
Рекомендации
- ^ PostgreSQL-учебник
- ^ upsert 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» . Проверено 27 сентября 2012 .
- ^ Страница PostgreSQL INSERT
- ^ «Новый CUBRID 9.0.0» . Официальный блог CUBRID. 2012-10-30 . Проверено 8 ноября 2012 .
- ^ 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.
Внешние ссылки
- Документация Oracle 11g Release 2 по MERGE
- Документация Firebird 2.1 по MERGE
- Оператор DB2 v9 MERGE
- Документация по Microsoft SQL Server
- Операторы изменения данных HSQLdb 2.0
- H2 (1.2) Страница синтаксиса SQL