Jump to content

Слияние (SQL)

Система управления реляционными базами данных использует SQL. MERGE (также называемые upsert ) для INSERT новые рекорды или UPDATE существующие записи в зависимости от соответствия условию . Он был официально представлен в стандарте SQL:2003 и расширен. [ нужна ссылка ] в стандарте SQL:2008 .

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

[ редактировать ]
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 ...]);

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

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

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

Реализации

[ редактировать ]

Системы управления базами данных PostgreSQL , [1] Базы данных Oracle , IBM Db2 , Teradata , EXASOL , Firebird , CUBRID , H2 , HSQLDB , MS SQL , Vectorwise и Apache Derby поддерживают стандартный синтаксис. Некоторые также добавляют нестандартные расширения SQL.

Синоним

[ редактировать ]

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

Он используется в базе данных SQL Microsoft Azure . [4]

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

[ редактировать ]

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

MySQL , например, поддерживает использование INSERT ... ON DUPLICATE KEY UPDATE синтаксис [5] который можно использовать для достижения аналогичного эффекта с тем ограничением, что соединение между целью и источником должно выполняться только по ограничениям PRIMARY KEY или UNIQUE, что не требуется в стандарте ANSI/ISO. Он также поддерживает >REPLACE INTO синтаксис, [6] который сначала пытается вставить, а если это не удается, удаляет строку, если она существует, а затем вставляет новую. Существует также IGNORE положение о INSERT заявление, [7] который сообщает серверу игнорировать ошибки «дубликата ключа» и продолжать работу (существующие строки не будут вставлены или обновлены, но будут вставлены все новые строки).

SQLite INSERT OR REPLACE INTO работает аналогично. Он также поддерживает REPLACE INTO как псевдоним для совместимости с MySQL. [8]

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 расширяется за счет поддержки защиты, а также поддержки левого соединения через WHEN NOT MATCHED BY SOURCE статьи.

PostgreSQL поддерживает слияние начиная с версии 15, но ранее поддерживалось слияние через INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action. [9]

КУБРИД поддерживает MERGE INTO[10] заявление. И поддерживает использование INSERT ... ON DUPLICATE KEY UPDATE синтаксис. [11] Он также поддерживает REPLACE INTO для совместимости с MySQL. [12]

Апач Феникс поддерживает UPSERT VALUES[13] и UPSERT SELECT[14] синтаксис.

Spark SQL поддерживает UPDATE SET * и INSERT * оговорки в действиях. [15]

Апач Импала поддерживает UPSERT INTO ... SELECT. [16]

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

[ редактировать ]

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

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

В Redis SET операции устанавливают значение, связанное с данным ключом. Redis не знает никаких подробностей внутренней структуры значения, поэтому обновление не имеет смысла. Итак, SET операция всегда имеет семантику установки или замены .

См. также

[ редактировать ]
  1. ^ «Э.1. Выпуск 15» . Документация PostgreSQL . 13 октября 2022 года. Архивировано из оригинала 13 октября 2022 года . Проверено 13 октября 2022 г.
  2. ^ «Обновление PostgreSQL с использованием инструкции INSERT ON CONFLICT» . Учебное пособие по PostgreSQL . Архивировано из оригинала 28 ноября 2022 года.
  3. ^ « upsert », SQLite, посещение 06.06.2018.
  4. ^ «СЛИВАНИЕ (Transact-SQL)» . Справочник по Transact-SQL (ядро СУБД) . Microsoft Learn. Архивировано из оригинала 24 июня 2016 г.
  5. ^ MySQL :: Справочное руководство MySQL 5.1 :: 12.2.4.3 Синтаксис INSERT ... ON DUPLICATE KEY UPDATE
  6. ^ Справочное руководство MySQL 5.1: 11.2.6 Синтаксис ЗАМЕНИТЬ
  7. ^ «Справочное руководство MySQL 5.5 :: 13.2.5 Синтаксис INSERT» . Проверено 29 октября 2013 г.
  8. ^ «SQL в понимании SQLite: INSERT» . Проверено 27 сентября 2012 г.
  9. ^ Страница вставки PostgreSQL
  10. ^ «Новый КУБРИД 9.0.0» . Официальный блог КУБРИДа. 30 октября 2012 г. Проверено 8 ноября 2012 г.
  11. ^ CUBRID :: Заявления о манипулировании данными :: Вставка :: Предложение ON DUPLICATE KEY UPDATE
  12. ^ CUBRID :: Заявления о манипулировании данными :: Заменить
  13. ^ «УВЕЛИЧИТЬ ЗНАЧЕНИЯ» .
  14. ^ «UPSERT ВЫБОР» .
  15. ^ «MERGE INTO (Delta Lake на Databricks)» .
  16. ^ «Заявление UPSERT (документация Apache Impala)» .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 218c7083b700a79def944f1e36f788e9__1711877940
URL1:https://arc.ask3.ru/arc/aa/21/e9/218c7083b700a79def944f1e36f788e9.html
Заголовок, (Title) документа по адресу, URL1:
Merge (SQL) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)