Реляційні системи керування базами даних використовують оператори SQL MERGE
(також звані upsert) для вставляння нових записів або оновлення наявних залежно від збігів за [en]. Цей оператор було офіційно впроваджено у стандарті 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
у цілі, тоUPDATE
- Якщо поля
ON
у джерелі не збігаються з полямиON
у цілі, тоINSERT
- Якщо полів
ON
не існує у джерелі, але є в цілі, то нічого не відбувається. - Якщо полів
ON
не існує ані в джерелі ані в цілі, то нічого не відбувається.
Якщо кілька рядків у джерелі відповідають одному рядкові в цілі, то, згідно стандарту SQL:2003, виникає помилка. Оновлювати рядки в цілі за допомогою оператора MERGE
декілька разів не можна.
Реалізації
Системи керування базами даних Oracle Database, DB2, Teradata, [en], Firebird, [en], HSQLDB, MS SQL, [en], [en] та BigQuery підтримують стандартний синтаксис. Деякі також додають нестандартні розширення SQL.
Синоніми
В деяких реалізаціях баз даних для операторів або їх комбінацій, що вставляють запис до таблиці бази даних, якщо його не існує, або ж оновлюють наявний запис, було обрано термін «Upsert» (словозлиття update та insert). Його також застосовують як скорочений варіант запису MERGE
у псевдокоді.
Він використовується в Microsoft SQL Azure.
Інші нестандартні реалізації
Деякі інші системи керування базами даних підтримують таку ж або дуже схожу поведінку за допомогою власних, нестандартних розширень SQL.
MySQL, наприклад, підтримує використання синтаксису INSERT ... ON DUPLICATE KEY UPDATE
, який можна використовувати для досягнення схожого ефекту, з тим обмеженням, що з'єднання між ціллю та джерелом має відбуватися винятково за примусів PRIMARY KEY
чи UNIQUE
, чого не вимагає стандарт ANSI/ISO. Вона також підтримує синтаксис REPLACE INTO
, який спочатку намагається вставити, а у разі невдачі видаляє рядок, якщо той існує, та вставляє новий. Існує також вираз IGNORE
для оператора INSERT
, що каже серверу ігнорувати помилки «дублікат ключа» та продовжувати (наявні рядки не вставлятимуться й не оновлюватимуться, але всі нові вставлятимуться).
Подібним чином працює INSERT OR REPLACE INTO
в SQLite. Він також підтримує REPLACE INTO
як псевдонім для сумісності з MySQL.
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 підтримує злиття за допомогою INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
.
[en] підтримує оператор MERGE INTO
, використання синтаксису INSERT ... ON DUPLICATE KEY UPDATE
, а також REPLACE INTO
для сумісності з MySQL.
[en] підтримує синтаксис UPSERT VALUES
і UPSERT SELECT
.
Див. також
- Join (SQL)
- [ru]
Примітки
- . Google Cloud. Архів оригіналу за 4 квітня 2019. Процитовано 13 березня 2019.
- MERGE (Transact-SQL). Transact-SQL Reference (Database Engine) (англійською) . Мережа розробників Майкрософт. оригіналу за 11 листопада 2016. Процитовано 27 грудня 2016.
- INSERT ... ON DUPLICATE KEY UPDATE Syntax. MySQL 5.7 Reference Manual (англійською) . оригіналу за 28 грудня 2016. Процитовано 27 грудня 2016.
- REPLACE Syntax. MySQL 5.7 Reference Manual (англійською) . оригіналу за 28 грудня 2016. Процитовано 27 грудня 2016.
- INSERT Syntax. MySQL 5.5 Reference Manual (англійською) . оригіналу за 24 жовтня 2013. Процитовано 29 жовтня 2013.
- SQL As Understood By SQLite: INSERT. SQLite (англійською) . оригіналу за 23 вересня 2012. Процитовано 27 вересня 2012.
- INSERT. PostgreSQL: Documentation: 9.6 (англійською) . оригіналу за 28 грудня 2016. Процитовано 27 грудня 2016.
- Сагінов, Есен (30 жовтня 2012). Announcing CUBRID 9.0 with 3x performance increase and Sharding support (англійською) . CUBRID Official Blog. оригіналу за 5 листопада 2012. Процитовано 8 листопада 2012.
- INSERT. CUBRID 10.0.0 Documentation (англійською) . оригіналу за 7 жовтня 2016. Процитовано 27 грудня 2016.
- String Functions and Operators. CUBRID 10.0.0 Documentation (англійською) . оригіналу за 7 жовтня 2016. Процитовано 27 грудня 2016.
- Grammar. [en] (англійською) . оригіналу за 27 грудня 2016. Процитовано 27 грудня 2016.
Література
- Хсу, Лео; Обе, Регіна (18 травня 2008). . Postgres OnLine Journal. Архів оригіналу за 26 листопада 2010. Процитовано 8 жовтня 2010.
- Чодоров, Крістіна; Діролф, Майк (вересень 2010). . O'Reilly Media. ISBN .
Посилання
- Документація Oracle 11g Release 2 з
MERGE
- Документація Firebird 2.1 з
MERGE
- Оператор MERGE у DB2 v9
- Документація Microsoft SQL Server
- Оператори зміни даних HSQLdb 2.0
- Сторінка синтаксису SQL у H2 (1.2)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Relyacijni sistemi keruvannya bazami danih vikoristovuyut operatori SQL MERGE takozh zvani upsert dlya vstavlyannya novih zapisiv abo onovlennya nayavnih zalezhno vid zbigiv za en Cej operator bulo oficijno vprovadzheno u standarti SQL 2003 ta rozshireno u standarti SQL 2008 ZastosuvannyaMERGE 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 Do cili tablicya INTO ta dzherela tablicya rozriz abo pidzapit USING zastosovuyetsya prave zovnishnye z yednannya v yakomu cil ye livoyu tabliceyu a dzherelo pravoyu Chotiri mozhlivi kombinaciyi vidpovidayut takim pravilam Yaksho polya ON u dzhereli zbigayutsya z polyami ON u cili to UPDATE Yaksho polya ON u dzhereli ne zbigayutsya z polyami ON u cili to INSERT Yaksho poliv ON ne isnuye u dzhereli ale ye v cili to nichogo ne vidbuvayetsya Yaksho poliv ON ne isnuye ani v dzhereli ani v cili to nichogo ne vidbuvayetsya Yaksho kilka ryadkiv u dzhereli vidpovidayut odnomu ryadkovi v cili to zgidno standartu SQL 2003 vinikaye pomilka Onovlyuvati ryadki v cili za dopomogoyu operatora MERGE dekilka raziv ne mozhna RealizaciyiSistemi keruvannya bazami danih Oracle Database DB2 Teradata en Firebird en HSQLDB MS SQL en en ta BigQuery pidtrimuyut standartnij sintaksis Deyaki takozh dodayut nestandartni rozshirennya SQL Sinonimi V deyakih realizaciyah baz danih dlya operatoriv abo yih kombinacij sho vstavlyayut zapis do tablici bazi danih yaksho jogo ne isnuye abo zh onovlyuyut nayavnij zapis bulo obrano termin Upsert slovozlittya update ta insert Jogo takozh zastosovuyut yak skorochenij variant zapisu MERGE u psevdokodi Vin vikoristovuyetsya v Microsoft SQL Azure Inshi nestandartni realizaciyi Deyaki inshi sistemi keruvannya bazami danih pidtrimuyut taku zh abo duzhe shozhu povedinku za dopomogoyu vlasnih nestandartnih rozshiren SQL MySQL napriklad pidtrimuye vikoristannya sintaksisu span class k INSERT span span class w span span class p span span class w span span class k ON span span class w span span class k DUPLICATE span span class w span span class k KEY span span class w span span class k UPDATE span yakij mozhna vikoristovuvati dlya dosyagnennya shozhogo efektu z tim obmezhennyam sho z yednannya mizh cillyu ta dzherelom maye vidbuvatisya vinyatkovo za primusiv PRIMARY KEY chi UNIQUE chogo ne vimagaye standart ANSI ISO Vona takozh pidtrimuye sintaksis REPLACE INTO yakij spochatku namagayetsya vstaviti a u razi nevdachi vidalyaye ryadok yaksho toj isnuye ta vstavlyaye novij Isnuye takozh viraz IGNORE dlya operatora INSERT sho kazhe serveru ignoruvati pomilki dublikat klyucha ta prodovzhuvati nayavni ryadki ne vstavlyatimutsya j ne onovlyuvatimutsya ale vsi novi vstavlyatimutsya Podibnim chinom pracyuye span class k INSERT span span class w span span class k OR span span class w span span class k REPLACE span span class w span span class k INTO span v SQLite Vin takozh pidtrimuye REPLACE INTO yak psevdonim dlya sumisnosti z MySQL Firebird pidtrimuye MERGE INTO hocha j ne mozhe vidavati pomilku koli dzherelo mistit kilka ryadkiv Krim togo isnuye odnoryadkovij variant span class k UPDATE span span class w span span class k OR span span class w span span class k INSERT span span class w span span class k INTO span span class w span span class n tablename span span class w span span class p span span class n columns span span class p span span class w span span class k VALUES span span class w span span class p span span class k values span span class p span span class w span span class p span span class n MATCHING span span class w span span class p span span class n columns span span class p span ale vin ne dozvolyaye vikonuvati rizni diyi pri vstavci chi onovlenni napriklad vstanovlennya novogo znachennya poslidovnosti lishe dlya novih zapisiv a ne nayavnih IBM DB2 rozshiryuye sintaksis kilkoma virazami WHEN MATCHED i WHEN NOT MATCHED rozriznyayuchi yih vartami span class p span span class w span span class k AND span span class w span span class k some span span class o span span class n condition span Microsoft SQL Server rozshiryuyetsya pidtrimkoyu vart a takozh pidtrimkoyu livogo zovnishnogo z yednannya za dopomogoyu viraziv span class k WHEN span span class w span span class ow NOT span span class w span span class n MATCHED span span class w span span class k BY span span class w span span class n SOURCE span PostgreSQL pidtrimuye zlittya za dopomogoyu span class k INSERT span span class w span span class k INTO span span class w span span class p span span class w span span class k ON span span class w span span class n CONFLICT span span class w span span class p span span class w span span class n conflict target span span class w span span class p span span class w span span class n conflict action span en pidtrimuye operator MERGE INTO vikoristannya sintaksisu span class k INSERT span span class w span span class p span span class w span span class k ON span span class w span span class k DUPLICATE span span class w span span class k KEY span span class w span span class k UPDATE span a takozh REPLACE INTO dlya sumisnosti z MySQL en pidtrimuye sintaksis UPSERT VALUES i UPSERT SELECT Div takozhJoin SQL ru Primitki Google Cloud Arhiv originalu za 4 kvitnya 2019 Procitovano 13 bereznya 2019 MERGE Transact SQL Transact SQL Reference Database Engine anglijskoyu Merezha rozrobnikiv Majkrosoft originalu za 11 listopada 2016 Procitovano 27 grudnya 2016 INSERT ON DUPLICATE KEY UPDATE Syntax MySQL 5 7 Reference Manual anglijskoyu originalu za 28 grudnya 2016 Procitovano 27 grudnya 2016 REPLACE Syntax MySQL 5 7 Reference Manual anglijskoyu originalu za 28 grudnya 2016 Procitovano 27 grudnya 2016 INSERT Syntax MySQL 5 5 Reference Manual anglijskoyu originalu za 24 zhovtnya 2013 Procitovano 29 zhovtnya 2013 SQL As Understood By SQLite INSERT SQLite anglijskoyu originalu za 23 veresnya 2012 Procitovano 27 veresnya 2012 INSERT PostgreSQL Documentation 9 6 anglijskoyu originalu za 28 grudnya 2016 Procitovano 27 grudnya 2016 Saginov Esen 30 zhovtnya 2012 Announcing CUBRID 9 0 with 3x performance increase and Sharding support anglijskoyu CUBRID Official Blog originalu za 5 listopada 2012 Procitovano 8 listopada 2012 INSERT CUBRID 10 0 0 Documentation anglijskoyu originalu za 7 zhovtnya 2016 Procitovano 27 grudnya 2016 String Functions and Operators CUBRID 10 0 0 Documentation anglijskoyu originalu za 7 zhovtnya 2016 Procitovano 27 grudnya 2016 Grammar en anglijskoyu originalu za 27 grudnya 2016 Procitovano 27 grudnya 2016 LiteraturaHsu Leo Obe Regina 18 travnya 2008 Postgres OnLine Journal Arhiv originalu za 26 listopada 2010 Procitovano 8 zhovtnya 2010 Chodorov Kristina Dirolf Majk veresen 2010 O Reilly Media ISBN 978 1 449 38156 1 PosilannyaDokumentaciya Oracle 11g Release 2 z MERGE Dokumentaciya Firebird 2 1 z MERGE Operator MERGE u DB2 v9 Dokumentaciya Microsoft SQL Server Operatori zmini danih HSQLdb 2 0 Storinka sintaksisu SQL u H2 1 2