MERGE
MERGE â добавиÑÑ, измениÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ ÑÑÑоки ÑаблиÑÑ Ð¿Ð¾ ÑÑловиÑ
СинÑакÑиÑ
[ WITHзапÑоÑ_WITH[, ...] ] MERGE INTO [ ONLY ]имÑ_Ñелевой_ÑаблиÑÑ[ * ] [ [ AS ]Ñелевой_пÑевдоним] USINGиÑÑоÑник_даннÑÑONÑÑловие_ÑоединениÑпÑедложение_when[...] [ RETURNING [ WITH ( { OLD | NEW } ASпÑевдоним_ÑезÑлÑÑаÑа[, ...] ) ] { * |вÑÑажение_ÑезÑлÑÑаÑа[ [ AS ]имÑ_ÑезÑлÑÑаÑа] } [, ...] ] ÐдеÑÑиÑÑоÑник_даннÑÑ: { [ ONLY ]имÑ_иÑÑ Ð¾Ð´Ð½Ð¾Ð¹_ÑаблиÑÑ[ * ] | (иÑÑ Ð¾Ð´Ð½Ñй_запÑоÑ) } [ [ AS ]иÑÑ Ð¾Ð´Ð½Ñй_пÑевдоним] ипÑедложение_when: { WHEN MATCHED [ ANDÑÑловие] THEN {изменение_пÑи_обÑединении|Ñдаление_пÑи_обÑединении| DO NOTHING } | WHEN NOT MATCHED BY SOURCE [ ANDÑÑловие] THEN {изменение_пÑи_обÑединении|Ñдаление_пÑи_обÑединении| DO NOTHING } | WHEN NOT MATCHED [ BY TARGET ] [ ANDÑÑловие] THEN {добавление_пÑи_обÑединении| DO NOTHING } } идобавление_пÑи_обÑединении: INSERT [(имÑ_ÑÑолбÑа[, ...] )] [ OVERRIDING { SYSTEM | USER } VALUE ] { VALUES ( {вÑÑажение| DEFAULT } [, ...] ) | DEFAULT VALUES } иизменение_пÑи_обÑединении: UPDATE SET {имÑ_ÑÑолбÑа= {вÑÑажение| DEFAULT } | (имÑ_ÑÑолбÑа[, ...] ) = [ ROW ] ( {вÑÑажение| DEFAULT } [, ...] ) | (имÑ_ÑÑолбÑа[, ...] ) = (вложеннÑй_SELECT) } [, ...] иÑдаление_пÑи_обÑединении: DELETE
ÐпиÑание
ÐпеÑаÑÐ¸Ñ MERGE вÑполнÑÐµÑ Ð´ÐµÐ¹ÑÑвиÑ, коÑоÑÑе менÑÑÑ ÑÑÑоки в Ñелевой ÑаблиÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼_Ñелевой_ÑаблиÑÑ, иÑполÑзÑÑ Ð¸ÑÑоÑник_даннÑÑ
. MERGE â ÑÑо один SQL-опеÑаÑоÑ, коÑоÑÑй по ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð²ÑполнÑÐµÑ Ñо ÑÑÑоками дейÑÑÐ²Ð¸Ñ INSERT, UPDATE или DELETE; ÑделаÑÑ Ñо же Ñамое без MERGE можно, ÑолÑко иÑполÑзÑÑ Ð½ÐµÑколÑко опеÑаÑоÑов пÑоÑедÑÑного ÑзÑка.
СнаÑала команда MERGE ÑоединÑÐµÑ Ð¸ÑÑоÑник_даннÑÑ
Ñ Ñелевой ÑаблиÑей, ÑоÑмиÑÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более ÑÑÑок-кандидаÑов на изменение. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки-кандидаÑа ÑÑÑанавливаеÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½ÑемÑй позже ÑÑаÑÑÑ MATCHED (ÑовпадаеÑ), NOT MATCHED BY SOURCE (не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð¿Ð¾ иÑÑоÑникÑ) или NOT MATCHED [BY TARGET]) (не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð¿Ð¾ Ñели), поÑле Ñего вÑÑиÑлÑÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHEN в заданном поÑÑдке. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ оÑделÑной ÑÑÑоки бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð´ÐµÐ¹ÑÑвие пеÑвого же пÑедложениÑ, ÑÑловие коÑоÑого вÑдаÑÑ true. ÐÑи ÑÑом Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки-кандидаÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñполнено дейÑÑвие не более Ñем одного пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHEN.
ÐейÑÑÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑии MERGE имеÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑекÑ, ÑÑо и обÑÑнÑе одноимÑннÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE, INSERT или DELETE. СинÑакÑÐ¸Ñ ÑÑиÑ
команд в MERGE оÑлиÑаеÑÑÑ, в ÑаÑÑноÑÑи, оÑÑÑÑÑÑвием пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE и имени ÑаблиÑÑ. ÐейÑÑÐ²Ð¸Ñ ÑÑиÑ
команд вÑполнÑÑÑÑÑ Ñ Ñелевой ÑаблиÑей, Ñ
оÑÑ Ð¿Ð¾ÑÑедÑÑвом ÑÑиггеÑов могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸ дÑÑгие ÑаблиÑÑ.
С Ñказанием DO NOTHING иÑÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока пÑопÑÑкаеÑÑÑ. ÐоÑколÑÐºÑ Ð¿ÑименимоÑÑÑ Ð´ÐµÐ¹ÑÑвий оÑениваеÑÑÑ Ð² заданном поÑÑдке, иÑполÑзÑÑ DO NOTHING, Ñдобно пÑопÑÑкаÑÑ Ð¸ÑÑ
однÑе ÑÑÑоки, не пÑедÑÑавлÑÑÑие инÑеÑеÑ, ÑÑÐ¾Ð±Ñ Ð·Ð°Ñем более деÑалÑно обÑабаÑÑваÑÑ Ð¾ÑÑалÑнÑе.
ÐÑедложение RETURNING ÑказÑваеÑ, ÑÑо команда MERGE должна вÑÑиÑлиÑÑ Ð¸ веÑнÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ вÑÑавленной, изменÑнной или ÑдалÑнной ÑÑÑоки. ÐÑÑиÑлиÑÑ Ð² нÑм можно лÑбое вÑÑажение Ñо ÑÑолбÑами иÑÑ
одной или Ñелевой ÑаблиÑÑ, а Ñакже ÑÑнкÑÐ¸Ñ merge_action(). Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ñи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT или UPDATE иÑполÑзÑÑÑÑÑ Ð½Ð¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов Ñелевой ÑаблиÑÑ, а пÑи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DELETE иÑполÑзÑÑÑÑÑ ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов Ñелевой ÑаблиÑÑ, но Ñакже можно Ñвно запÑоÑиÑÑ ÑÑаÑÑе и новÑе знаÑениÑ. СпиÑок RETURNING Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и ÑпиÑок ÑезÑлÑÑаÑов SELECT.
ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ MERGE не пÑедÑÑмоÑÑено оÑделÑное пÑаво. ÐÑли полÑзоваÑÐµÐ»Ñ ÑказÑÐ²Ð°ÐµÑ Ð² ней дейÑÑвие UPDATE, Ñ Ð½ÐµÐ³Ð¾ должно бÑÑÑ Ð¿Ñаво UPDATE Ð´Ð»Ñ ÑÑолбÑов Ñелевой ÑаблиÑÑ, на коÑоÑÑе ÑÑÑлаеÑÑÑ Ð¿Ñедложение SET. Ðогда ÑказÑваеÑÑÑ Ð´ÐµÐ¹ÑÑвие INSERT или DELETE, Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑооÑвеÑÑÑвÑÑÑее пÑаво Ð´Ð»Ñ Ñелевой ÑаблиÑÑ. ÐÑли полÑзоваÑÐµÐ»Ñ ÑказÑÐ²Ð°ÐµÑ Ð´ÐµÐ¹ÑÑвие DO NOTHING, Ñ Ð½ÐµÐ³Ð¾ должно бÑÑÑ Ð¿Ñаво SELECT Ñ
оÑÑ Ð±Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа Ñелевой ÑаблиÑÑ. ÐÑоме Ñого, необÑ
одимо имеÑÑ Ð¿Ñаво SELECT Ð´Ð»Ñ Ð»ÑбÑÑ
ÑÑолбÑов иÑÑоÑника_даннÑÑ
и Ñелевой ÑаблиÑÑ, коÑоÑÑе ÑигÑÑиÑÑÑÑ Ð² condition (в Ñом ÑиÑле join_condition) или expression. ÐÑава пÑовеÑÑÑÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз в наÑале вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа, вне завиÑимоÑÑи Ð¾Ñ Ñого, бÑдÑÑ Ð»Ð¸ вÑполнÑÑÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHEN.
ÐпеÑаÑÐ¾Ñ MERGE не поддеÑживаеÑÑÑ Ð´Ð»Ñ ÑелевÑÑ
ÑаблиÑ, ÑвлÑÑÑиÑ
ÑÑ Ð¼Ð°ÑеÑиализованнÑми пÑедÑÑавлениÑми, ÑÑоÑонними ÑаблиÑами, или еÑли Ð´Ð»Ñ Ð½Ð¸Ñ
Ð·Ð°Ð´Ð°Ð½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо пÑавила.
ÐаÑамеÑÑÑ
запÑоÑ_WITHÐÑедложение
WITHпозволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко подзапÑоÑов, на коÑоÑÑе заÑем можно ÑÑÑлаÑÑÑÑ Ð¿Ð¾ имени в запÑоÑеMERGE. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 7.8 и SELECT. ÐбÑаÑиÑе внимание, ÑÑо пÑедложениеWITH RECURSIVEÐ´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑMERGEне поддеÑживаеÑÑÑ.имÑ_Ñелевой_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) Ñелевой ÑаблиÑÑ Ð¸Ð»Ð¸ пÑедÑÑавлениÑ, коÑоÑÑе пÑинимаÑÑ ÑезÑлÑÑÐ°Ñ Ð¾Ð±ÑединениÑ. ÐÑли пеÑед именем ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾
ONLY, ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки изменÑÑÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑÑÑ ÑолÑко в Ñказанной ÑаблиÑе. ÐезONLYÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки Ñакже изменÑÑÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑÑÑ Ð²Ð¾ вÑÐµÑ ÑаблиÑÐ°Ñ , ÑнаÑледованнÑÑ Ð¾Ñ Ñказанной ÑаблиÑÑ. ÐÑи желании, поÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо опеÑаÑÐ¸Ñ Ð·Ð°ÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе доÑеÑние ÑаблиÑÑ. ÐлÑÑевое ÑловоONLYи паÑамеÑÑ*не влиÑÑÑ Ð½Ð° дейÑÑвиÑINSERT, добавлÑÑÑие ÑÑÑоки ÑолÑко в ÑказаннÑÑ ÑаблиÑÑ.ÐÑли в
имени_Ñелевой_ÑаблиÑÑÑказано Ð¸Ð¼Ñ Ð¿ÑедÑÑавлениÑ, оно должно бÑÑÑ Ð»Ð¸Ð±Ð¾ авÑомаÑиÑеÑки изменено без ÑÑиггеÑовINSTEAD OF, либо имеÑÑ ÑÑиггеÑÑINSTEAD OFÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ дейÑÑÐ²Ð¸Ñ (INSERT,UPDATEиDELETE), Ñказанного в пÑедложенииWHEN. ÐÑедÑÑавлениÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð´Ð°Ð½Ñ Ð¿Ñавила, не поддеÑживаÑÑÑÑ.Ñелевой_пÑевдонимÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ Ñелевой ÑаблиÑÑ. Ðогда ÑÑо Ð¸Ð¼Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ, наÑÑоÑÑее Ð¸Ð¼Ñ ÑаблиÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑкÑÑваеÑÑÑ. ÐапÑимеÑ, в запÑоÑе
MERGE INTO foo AS fоÑÑалÑнÑе компоненÑÑ Ð¾Ð¿ÐµÑаÑоÑаMERGEÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº Ñелевой ÑаблиÑе по имениf, а неfoo.имÑ_иÑÑ Ð¾Ð´Ð½Ð¾Ð¹_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ пеÑÐµÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ. ÐÑли пеÑед именем ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾
ONLY, ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки беÑÑÑÑÑ ÑолÑко из Ñказанной ÑаблиÑÑ. ÐезONLYÑÑÑоки Ñакже беÑÑÑÑÑ Ð¸Ð· вÑÐµÑ ÑаблиÑ, ÑнаÑледованнÑÑ Ð¾Ñ Ñказанной. ÐÑи желании, поÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо опеÑаÑÐ¸Ñ Ð·Ð°ÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе доÑеÑние ÑаблиÑÑ.иÑÑ Ð¾Ð´Ð½Ñй_запÑоÑÐапÑÐ¾Ñ (опеÑаÑоÑ
SELECTили опеÑаÑоÑVALUES), пÑедоÑÑавлÑÑÑий ÑÑÑоки Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² Ñелевой ÑаблиÑе. Ðа инÑоÑмаÑией о ÑинÑакÑиÑе обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ SELECT и VALUES.иÑÑ Ð¾Ð´Ð½Ñй_пÑевдонимÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¸ÑÑоÑника даннÑÑ . Ðогда задаÑÑÑÑ ÑÑÐ¾Ñ Ð¿Ñевдоним, он полноÑÑÑÑ ÑкÑÑÐ²Ð°ÐµÑ Ð½Ð°ÑÑоÑÑее Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ ÑÐ¾Ñ ÑакÑ, ÑÑо ÑÑо ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑа.
ÑÑловие_ÑоединениÑÐадаваемое
ÑÑловие_ÑоединениÑпÑедÑÑавлÑÐµÑ Ñобой вÑÑажение, вÑдаÑÑее знаÑение Ñипаboolean(как в пÑедложенииWHERE), коÑоÑое опÑеделÑеÑ, какие ÑÑÑоки виÑÑоÑнике_даннÑÑÑооÑвеÑÑÑвÑÑÑ ÑÑÑокам в Ñелевой ÑаблиÑе.ÐÑедÑпÑеждение
Ð
ÑÑловии_ÑоединениÑÐ´Ð¾Ð»Ð¶Ð½Ñ ÑигÑÑиÑоваÑÑ ÑолÑко ÑÑолбÑÑ Ñелевой ÑаблиÑÑ, по коÑоÑÑм ÐµÑ ÑÑÑоки ÑопоÑÑавлÑÑÑÑÑ Ñо ÑÑÑокамииÑÑоÑника_даннÑÑ. ÐодвÑÑажениÑÑÑловиÑ_ÑоединениÑ, ÑÑÑлаÑÑиеÑÑ ÑолÑко на ÑÑолбÑÑ Ñелевой ÑаблиÑÑ, могÑÑ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° вÑполнÑемое дейÑÑвие, ÑаÑÑо неожиданнÑм обÑазом.ÐÑли ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¾Ð±Ð° пÑедложениÑ
WHEN NOT MATCHED BY SOURCEиWHEN NOT MATCHED [BY TARGET], командаMERGEÑÐ´ÐµÐ»Ð°ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ Ñоединение (FULL JOIN)иÑÑоÑника_даннÑÑÑ Ñелевой ÑаблиÑей. ÐÐ»Ñ ÐºÐ¾ÑÑекÑной ÑабоÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, ÑÑÐ¾Ð±Ñ Ñ Ð¾ÑÑ Ð±Ñ Ð² одном подвÑÑаженииÑÑловиÑ_ÑоединениÑиÑполÑзовалÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой Ñоединений по Ñ ÐµÑÑ, или ÑÑÐ¾Ð±Ñ Ð²Ð¾ вÑÐµÑ Ð¿Ð¾Ð´Ð²ÑÑажениÑÑ Ð¸ÑполÑзовалиÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой Ñоединений ÑлиÑнием.пÑедложение_whenРкоманде
MERGEдолжно бÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм одно пÑедложениеWHEN.РпÑедложении
WHENможно задаÑÑWHEN MATCHED,WHEN NOT MATCHED BY SOURCEилиWHEN NOT MATCHED [BY TARGET]. ÐбÑаÑиÑе внимание, ÑÑо ÑÑандаÑÑ SQL опÑеделÑÐµÑ ÑолÑкоWHEN MATCHEDиWHEN NOT MATCHED(оÑÑÑÑÑÑвие ÑооÑвеÑÑÑвÑÑÑей Ñелевой ÑÑÑоки).WHEN NOT MATCHED BY SOURCEÑвлÑеÑÑÑ ÑаÑÑиÑением ÑÑандаÑÑа SQL как ÑпоÑоб ÑовмеÑÑно иÑполÑзоваÑÑBY TARGETиWHEN NOT MATCHEDÐ´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ ÑоÑного запÑоÑа.ÐÑли в пÑедложении
WHENÑказаноWHEN MATCHEDи ÑÑÑока-ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð½Ð° изменение пÑедÑÑавлÑÐµÑ Ñобой ÑÑÑÐ¾ÐºÑ Ð¸Ð·Ð¸ÑÑоÑника_даннÑÑ, ÑовпадаÑÑÑÑ Ñо ÑÑÑокой Ñелевой ÑаблиÑÑ, Ñо пÑедложениеWHENвÑполнÑеÑÑÑ, когдаÑÑловиеоÑÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ оÑениваеÑÑÑ ÐºÐ°Ðºtrue.РнаобоÑоÑ, еÑли в пÑедложении
WHENÑказаноWHEN NOT MATCHED BY SOURCEи ÑÑÑока-ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð½Ð° изменение ÑвлÑеÑÑÑ ÑÑÑокой Ñелевой ÑаблиÑÑ, коÑоÑÐ°Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑоке виÑÑоÑнике_даннÑÑ, пÑедложениеWHENвÑполнÑеÑÑÑ, когдаÑÑловиеоÑÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ оÑениваеÑÑÑ ÐºÐ°Ðºtrue.ÐÑли в пÑедложении
WHENÑказаноWHEN NOT MATCHED [BY TARGET]и ÑÑÑока-ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð½Ð° изменение ÑвлÑеÑÑÑ ÑÑÑокой виÑÑоÑнике_даннÑÑ, коÑоÑÐ°Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑоке Ñелевой ÑаблиÑÑ, пÑедложениеWHENвÑполнÑеÑÑÑ, когдаÑÑловиеоÑÑÑÑÑÑвÑÐµÑ Ð¸Ð»Ð¸ оÑениваеÑÑÑ ÐºÐ°Ðºtrue.ÑÑловиеÐÑÑажение, вÑдаÑÑее знаÑение Ñипа
boolean. ÐÑли ÑÑо вÑÑажение Ð´Ð»Ñ Ð¿ÑедложениÑWHENвÑдаÑÑtrue, Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки вÑполнÑеÑÑÑ Ð´ÐµÐ¹ÑÑвие ÑÑого пÑедложениÑ.УÑловие в пÑедложении
WHEN MATCHEDÐ¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° ÑÑолбÑÑ ÐºÐ°Ðº иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾, Ñак и Ñелевого оÑноÑениÑ. УÑловие в пÑедложенииWHEN NOT MATCHED BY SOURCEÐ¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÑолÑко на ÑÑолбÑÑ Ñелевого оÑноÑениÑ, поÑколÑÐºÑ ÑооÑвеÑÑÑвÑÑÑей иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки Ð½ÐµÑ Ð¿Ð¾ опÑеделениÑ. УÑловие в пÑедложенииWHEN NOT MATCHED [BY TARGET]Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ ÑолÑко на ÑÑолбÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ оÑноÑениÑ, поÑколÑÐºÑ ÑооÑвеÑÑÑвÑÑÑей Ñелевой ÑÑÑоки Ð½ÐµÑ Ð¿Ð¾ опÑеделениÑ. Ð Ñелевой ÑаблиÑе доÑÑÑÐ¿Ð½Ñ ÑолÑко ÑиÑÑемнÑе аÑÑибÑÑÑ.добавление_пÑи_обÑединенииУказание дейÑÑвиÑ
INSERT, добавлÑÑÑего Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð² ÑелевÑÑ ÑаблиÑÑ. Ðмена ÑелевÑÑ ÑÑолбÑов могÑÑ Ð¿ÐµÑеÑиÑлÑÑÑÑÑ Ð² лÑбом поÑÑдке. ÐÑли ÑпиÑок имÑн ÑÑолбÑов не задан вовÑе, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð²Ñе ÑÑолбÑÑ ÑаблиÑÑ Ð² поÑÑдке обÑÑвлениÑ.ÐÑе ÑÑолбÑÑ, не пÑедÑÑавленнÑе в Ñвном или неÑвном ÑпиÑке ÑÑолбÑов, полÑÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, еÑли Ð´Ð»Ñ Ð½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ñ ÑÑи знаÑениÑ, либо NULL в пÑоÑивном ÑлÑÑае.
ÐÑли ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа ÑвлÑеÑÑÑ ÑекÑиониÑованной, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока напÑавлÑеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑÑÑ ÑекÑÐ¸Ñ Ð¸ добавлÑеÑÑÑ Ð² неÑ. ÐÑли ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа ÑвлÑеÑÑÑ ÑекÑией и какаÑ-либо Ð²Ñ Ð¾Ð´Ð½Ð°Ñ ÑÑÑока наÑÑÑÐ¸Ñ Ð¾Ð³ÑаниÑение ÑекÑии, пÑоизойдÑÑ Ð¾Ñибка.
Ðмена ÑÑолбÑов нелÑÐ·Ñ ÑказÑваÑÑ Ð±Ð¾Ð»ÐµÐµ одного Ñаза. ÐейÑÑвиÑ
INSERTне могÑÑ ÑодеÑжаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе запÑоÑÑSELECT.ÐÑедложение
VALUESÐ¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑÑÑ ÑолÑко один Ñаз. СÑÑлаÑÑÑÑ Ð² нÑм можно ÑолÑко на ÑÑолбÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ оÑноÑениÑ, Ñак как ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑелевÑÑ ÑÑÑок Ð½ÐµÑ Ð¿Ð¾ опÑеделениÑ.изменение_пÑи_обÑединенииУказание дейÑÑвиÑ
UPDATE, изменÑÑÑего ÑекÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ñелевой ÑаблиÑÑ. Ðмена ÑÑолбÑов нелÑÐ·Ñ ÑказÑваÑÑ Ð±Ð¾Ð»ÐµÐµ одного Ñаза.ÐадаваÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸ пÑедложение
WHEREздеÑÑ Ð½ÐµÐ»ÑзÑ.Ñдаление_пÑи_обÑединенииУказание дейÑÑвиÑ
DELETE, ÑдалÑÑÑего ÑекÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ñелевой ÑаблиÑÑ. ÐадаваÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ какие-либо дÑÑгие пÑедложениÑ, как в обÑÑной команде DELETE, здеÑÑ Ð½ÐµÐ»ÑзÑ.имÑ_ÑÑолбÑаÐÐ¼Ñ ÑÑолбÑа Ñелевой ÑаблиÑÑ. ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð¸Ð¼Ñ ÑÑолбÑа можно дополниÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¿Ð¾Ð»Ñ Ð¸Ð»Ð¸ индекÑом маÑÑива. (ÐÑи добавлении даннÑÑ Ð»Ð¸ÑÑ Ð² некоÑоÑÑе Ð¿Ð¾Ð»Ñ ÑоÑÑавного Ñипа дÑÑгие Ð¿Ð¾Ð»Ñ Ð±ÑдÑÑ ÑодеÑжаÑÑ NULL.) ÐÐ¼Ñ ÑаблиÑÑ Ð² Ñказание Ñелевого ÑÑолбÑа добавлÑÑÑ Ð½Ðµ нÑжно.
OVERRIDING SYSTEM VALUEÐез ÑÑого пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ допÑÑкаеÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ Ñвного знаÑÐµÐ½Ð¸Ñ (оÑлиÑного оÑ
DEFAULT) Ð´Ð»Ñ ÑÑолбÑа иденÑиÑикаÑии, опÑеделÑнного Ñ Ñ Ð°ÑакÑеÑиÑÑикойGENERATED ALWAYS. Ðанное пÑедложение пеÑекÑÑÐ²Ð°ÐµÑ ÑÑо огÑаниÑение.OVERRIDING USER VALUEÐÑли ÑказÑваеÑÑÑ ÑÑо пÑедложение, Ñо знаÑениÑ, заданнÑе Ð´Ð»Ñ ÑÑолбÑов иденÑиÑикаÑии, коÑоÑÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñ Ñ Ð°ÑакÑеÑиÑÑикой
GENERATED BY DEFAULT, игноÑиÑÑÑÑÑÑ Ð¸ вмеÑÑо Ð½Ð¸Ñ Ð¿ÑименÑÑÑÑÑ Ð·Ð½Ð°ÑениÑ, вÑдаваемÑе поÑледоваÑелÑноÑÑÑми по ÑмолÑаниÑ.DEFAULT VALUESÐÑе ÑÑолбÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. (ÐÑедложение
OVERRIDINGв ÑÑой ÑоÑме не допÑÑкаеÑÑÑ.)вÑÑажениеÐÑÑажение, ÑезÑлÑÑÐ°Ñ ÐºÐ¾ÑоÑого пÑиÑваиваеÑÑÑ ÑÑолбÑÑ. РвÑÑажениÑÑ Ð¿Ñедложений
WHEN MATCHEDмогÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð· иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки Ñелевой ÑаблиÑÑ Ð¸ знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑÑокииÑÑоÑника_даннÑÑ. РвÑÑажениÑÑ Ð¿ÑедложенийWHEN NOT MATCHED BY SOURCEмогÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑолÑко из иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки в Ñелевой ÑаблиÑе. РвÑÑажениÑÑ Ð¿ÑедложенийWHEN NOT MATCHED [BY TARGET]могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑолÑко изиÑÑоÑника_даннÑÑ.DEFAULTÐÑиÑвоиÑÑ ÑÑолбÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ (или
NULL, еÑли вÑÑажение по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑа не опÑеделено).вложеннÑй_SELECTÐодзапÑоÑ
SELECT, вÑдаÑÑий ÑÑолÑко вÑÑ Ð¾Ð´Ð½ÑÑ ÑÑолбÑов, ÑколÑко пеÑеÑиÑлено в пÑедÑеÑÑвÑÑÑем ÐµÐ¼Ñ ÑпиÑке ÑÑолбÑов в ÑÐºÐ¾Ð±ÐºÐ°Ñ . ÐÑи вÑполнении ÑÑого подзапÑоÑа должна бÑÑÑ Ð¿Ð¾Ð»ÑÑена макÑимÑм одна ÑÑÑока. ÐÑли он вÑдаÑÑ Ð¾Ð´Ð½Ñ ÑÑÑокÑ, знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов в нÑм пÑиÑваиваÑÑÑÑ ÑелевÑм ÑÑолбÑам; еÑли же он не возвÑаÑÐ°ÐµÑ ÑÑÑокÑ, ÑелевÑм ÑÑолбÑам пÑиÑваиваеÑÑÑ NULL. ÐÑи иÑполÑзовании пÑедложениÑWHEN MATCHEDподзапÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº знаÑениÑм иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки в Ñелевой ÑаблиÑе, а Ñакже знаÑениÑм ÑÑÑокииÑÑоÑника_даннÑÑ. ÐÑи иÑполÑзовании пÑедложениÑWHEN NOT MATCHED BY SOURCEподзапÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ ÑолÑко к знаÑениÑм иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки в Ñелевой ÑаблиÑе.пÑевдоним_ÑезÑлÑÑаÑаÐеобÑзаÑелÑнÑй пÑевдоним Ð´Ð»Ñ ÑÑÑок
OLDилиNEWв ÑпиÑкеRETURNING.Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñелевой ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
OLD.илиимÑ_ÑÑолбÑаOLD.*, а новÑе â Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑNEW.илиимÑ_ÑÑолбÑаNEW.*. ÐÑли Ð·Ð°Ð´Ð°Ð½Ñ Ð¿ÑевдонимÑ, ÑÑи имена недоÑÑÑпнÑ, и обÑаÑаÑÑÑÑ Ðº знаÑениÑм нÑжно ÑеÑез пÑевдонимÑ, напÑимеÑRETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.вÑÑажение_ÑезÑлÑÑаÑаÐÑÑажение, вÑÑиÑлÑемое и возвÑаÑаемое командой
MERGEпоÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки (добавлениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑдалениÑ). Ð ÑÑом вÑÑажении можно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° лÑбÑÑ ÑÑолбÑов иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ и Ñелевой ÑаблиÑÑ Ð¸Ð»Ð¸ ÑÑнкÑиÑmerge_action()Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии о вÑполнÑемÑÑ Ð´ÐµÐ¹ÑÑвиÑÑ .С Ñказанием
*возвÑаÑаÑÑÑÑ Ð²Ñе ÑÑолбÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ, а поÑле Ð½Ð¸Ñ â вÑе ÑÑолбÑÑ Ñелевой. ÐбÑÑно ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº болÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑÐ²Ñ Ð´ÑбликаÑов, поÑколÑÐºÑ Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ и Ñелевой ÑаблиÑÑ ÑаÑÑо одинаковÑе ÑÑолбÑÑ. ÐÑого можно избежаÑÑ, Ñказав пÑи иÑполÑзовании*имена или пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ или Ñелевой ÑаблиÑÑ.ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑаÑÑе или новÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñелевой ÑаблиÑÑ, можно дополниÑÑ Ð¸Ð¼Ñ ÑÑолбÑа или
*Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑOLDилиNEWили ÑооÑвеÑÑÑвÑÑÑегопÑевдонима_ÑезÑлÑÑаÑадлÑOLDилиNEW. ÐÑи иÑполÑзовании имени ÑÑолбÑа без дополнений или же имени ÑÑолбÑа или*, дополненнÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ или пÑевдонимом Ñелевой ÑаблиÑÑ, возвÑаÑаÑÑÑÑ Ð½Ð¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´ÐµÐ¹ÑÑвийINSERTиUPDATEи ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´ÐµÐ¹ÑÑвийDELETE.имÑ_ÑезÑлÑÑаÑаÐмÑ, назнаÑаемое возвÑаÑÐ°ÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ.
ÐÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
ÐÑи ÑÑпеÑном вÑполнении команда MERGE возвÑаÑÐ°ÐµÑ Ð¼ÐµÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² виде
MERGE обÑее_ÑиÑло
ÐдеÑÑ Ð¾Ð±Ñее_ÑиÑло â ÑÑммаÑное колиÑеÑÑво изменÑннÑÑ
ÑÑÑок (добавленнÑÑ
, изменÑннÑÑ
или ÑдалÑннÑÑ
). ÐÑли обÑее_ÑиÑло Ñавно 0, ни одна ÑÑÑока не бÑла изменена.
ÐÑли команда MERGE ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение RETURNING, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ñ
ож на ÑезÑлÑÑÐ°Ñ SELECT (Ñ Ñеми же ÑÑолбÑами и знаÑениÑми, ÑÑо ÑодеÑжаÑÑÑ Ð² ÑпиÑке RETURNING) Ð´Ð»Ñ ÑÑÑок, добавленнÑÑ
, изменÑннÑÑ
или ÑдалÑннÑÑ
ÑÑой командой.
ÐÑимеÑаниÑ
Ð Ñ
оде вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ MERGE пÑоизводÑÑÑÑ ÑледÑÑÑие дейÑÑвиÑ.
ÐÑзÑваÑÑÑÑ Ð²Ñе ÑÑиггеÑÑ
BEFORE STATEMENTÐ´Ð»Ñ Ð²ÑÐµÑ ÑказаннÑÑ Ð´ÐµÐ¹ÑÑвий, незавиÑимо Ð¾Ñ Ñого, ÑовпадаÑÑ Ð»Ð¸ Ð¸Ñ Ð¿ÑедложениÑWHEN.ÐÑполнÑеÑÑÑ Ñоединение иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ Ñ Ñелевой. ÐолÑÑеннÑй в ÑезÑлÑÑаÑе запÑÐ¾Ñ Ð¾Ð¿ÑимизиÑÑеÑÑÑ ÐºÐ°Ðº обÑÑно и вÑдаÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок-кандидаÑов на изменение. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки-кандидаÑа на изменение:
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки опÑеделÑеÑÑÑ ÑоÑÑоÑние:
MATCHED(ÑовпадаеÑ),NOT MATCHED BY SOURCE(не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð¿Ð¾ иÑÑоÑникÑ) илиNOT MATCHED [BY TARGET](не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ð¿Ð¾ Ñели).ÐÑовеÑÑеÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ ÑÑловие
WHENв заданном поÑÑдке, пока какое-либо не вÑдаÑÑ Ð·Ð½Ð°Ñение true.ÐÑли ÑÑловие оÑениваеÑÑÑ ÐºÐ°Ðº
true, пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑледÑÑÑее:ÐÑзÑваÑÑÑÑ Ð²Ñе ÑÑиггеÑÑ
BEFORE ROW, ÑооÑвеÑÑÑвÑÑÑие ÑÐ¸Ð¿Ñ ÑобÑÑÐ¸Ñ Ð²ÑполнÑемого дейÑÑвиÑ.ÐÑполнÑеÑÑÑ Ñказанное дейÑÑвие, пÑи ÑÑом вÑзÑваÑÑÑÑ Ð¾Ð³ÑаниÑениÑ-пÑовеÑки Ð´Ð»Ñ Ñелевой ÑаблиÑÑ.
ÐÑзÑваÑÑÑÑ Ð²Ñе ÑÑиггеÑÑ
AFTER ROW, ÑооÑвеÑÑÑвÑÑÑие ÑÐ¸Ð¿Ñ ÑобÑÑÐ¸Ñ Ð²ÑполнÑемого дейÑÑвиÑ.
ÐÑли Ñелевое оÑноÑение ÑвлÑеÑÑÑ Ð¿ÑедÑÑавлением Ñ ÑÑиггеÑами
INSTEAD OF ROW, ÑооÑвеÑÑÑвÑÑÑими ÑÐ¸Ð¿Ñ ÑобÑÑÐ¸Ñ Ð²ÑполнÑемого дейÑÑвиÑ, Ñо ÑÑиггеÑÑ Ð²ÑполнÑÑÑ ÑÑи дейÑÑвиÑ.
ÐÑполнÑÑÑÑÑ Ð²Ñе ÑÑиггеÑÑ
AFTER STATEMENTÐ´Ð»Ñ Ð²ÑÐµÑ ÑказаннÑÑ Ð´ÐµÐ¹ÑÑвий, незавиÑимо Ð¾Ñ Ñого, вÑполнÑлиÑÑ Ð»Ð¸ ÑÑи дейÑÑÐ²Ð¸Ñ ÑакÑиÑеÑки. ÐÑо Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на поведение опеÑаÑоÑаUPDATE, когда он не менÑÐµÑ Ð½Ð¸ одной ÑÑÑоки.
То еÑÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого ÑобÑÑÐ¸Ñ (Ñкажем, INSERT) бÑдÑÑ Ð²ÑзÑваÑÑÑÑ Ð²Ñегда, когда ÑказÑваеÑÑÑ Ð´ÐµÐ¹ÑÑвие Ñакого Ñипа. ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок, напÑоÑив, вÑзÑваÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного дейÑÑвиÑ, коÑоÑое вÑполнÑеÑÑÑ. Таким обÑазом, пÑи вÑполнении MERGE могÑÑ Ð²ÑзÑваÑÑÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа как Ð´Ð»Ñ UPDATE, Ñак и Ð´Ð»Ñ INSERT, даже еÑли на ÑÑовне ÑÑÑок вÑзÑвалиÑÑ ÑолÑко ÑÑиггеÑÑ UPDATE.
СледÑÐµÑ Ð¿Ð¾Ð·Ð°Ð±Ð¾ÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñелевой ÑÑÑоки в ÑезÑлÑÑаÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑоздавалоÑÑ Ð½Ðµ более одной ÑÑÑоки-кандидаÑа на изменение. ÐÑÑгими Ñловами, ÑÐµÐ»ÐµÐ²Ð°Ñ ÑÑÑока не должна ÑоединÑÑÑÑÑ Ñ Ð±Ð¾Ð»ÐµÐµ Ñем одной ÑÑÑокой иÑÑоÑника даннÑÑ
. ÐÑли ÑÑо не Ñак, ÑолÑко одна из ÑÑÑок-кандидаÑов бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñелевой ÑÑÑоки; поÑледÑÑÑие попÑÑки измениÑÑ ÑÑÑ ÑÑÑÐ¾ÐºÑ Ð²ÑзовÑÑ Ð¾ÑибкÑ. ÐÑибка Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи, когда ÑÑиггеÑÑ ÑÑÑок вноÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑелевÑÑ ÑаблиÑÑ, а команда MERGE впоÑледÑÑвии воздейÑÑвÑÐµÑ Ð½Ð° Ñже изменÑннÑе ÑÑÑоки. ÐÑли повÑоÑиÑÑÑ Ð´ÐµÐ¹ÑÑвие INSERT, ÑÑо вÑÐ·Ð¾Ð²ÐµÑ Ð½Ð°ÑÑÑение ÑникалÑноÑÑи, а повÑоÑение UPDATE или DELETE вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Â«ÐаÑÑÑение колиÑеÑÑва»; поÑледнее ÑÑебÑеÑÑÑ ÑÑандаÑÑом SQL. Такое поведение оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñоединений в UPDATE и DELETE, ÑÑадиÑионного Ð´Ð»Ñ PostgreSQL, когда вÑоÑÐ°Ñ Ð¸ поÑледÑÑÑие попÑÑки измениÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑÑÐ¾ÐºÑ Ð¿ÑоÑÑо игноÑиÑÑÑÑÑÑ.
ÐÑли в пÑедложении WHEN оÑÑÑÑÑÑвÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное ÑÑловие AND, оно ÑÑановиÑÑÑ Ð¿Ð¾Ñледним доÑÑижимÑм пÑедложением ÑÑого Ñода (MATCHED, NOT MATCHED BY SOURCE или NOT MATCHED [BY TARGET]). ÐÑли в команде вÑÑÑеÑиÑÑÑ Ð¿Ð¾ÑледÑÑÑее пÑедложение WHEN Ñакого Ñода, оно гаÑанÑиÑованно бÑÐ´ÐµÑ Ð½ÐµÐ´Ð¾ÑÑижимÑм, и ÑÑо вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ. Ð ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¿Ð¾Ñледнего доÑÑижимого пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð»Ñбого Ñода возможна ÑиÑÑаÑиÑ, когда Ð´Ð»Ñ ÑÑÑоки-кандидаÑа на изменение не бÑÐ´ÐµÑ Ð¿ÑедпÑинÑÑо никакиÑ
дейÑÑвий.
ÐоÑÑдок, в коÑоÑом ÑÑÑоки вÑдаÑÑÑÑ Ð¸Ð· иÑÑоÑника даннÑÑ
, по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ опÑеделÑн. ÐÑли необÑ
одим опÑеделÑннÑй поÑÑдок, напÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовок Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°ÑаллелÑнÑми ÑÑанзакÑиÑми, его можно задаÑÑ Ð² иÑÑ
одном_запÑоÑе.
Ðогда MERGE вÑполнÑеÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно Ñ Ð´ÑÑгими командами, изменÑÑÑими ÑелевÑÑ ÑаблиÑÑ, пÑименÑÑÑÑÑ Ð¾Ð±ÑÑнÑе пÑавила изолÑÑии ÑÑанзакÑий; поведение на каждом ÑÑовне изолÑÑии опиÑано в Разделе 13.2. РкаÑеÑÑве алÑÑеÑнаÑÐ¸Ð²Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑаÑÑмоÑÑеÑÑ Ð¸ÑполÑзование опеÑаÑоÑа INSERT ... ON CONFLICT, коÑоÑÑй пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE, еÑли паÑаллелÑно вÑполнÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° INSERT. ÐÑи два Ñипа опеÑаÑоÑов имеÑÑ ÑÑд ÑазлиÑий и оÑобÑÑ
огÑаниÑений, они не ÑвлÑÑÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð·Ð°Ð¼ÐµÐ½ÑемÑми.
ÐÑимеÑÑ
ÐоÑÑекÑиÑовка клиенÑÑкиÑ
ÑÑеÑов (customer_accounts) Ñ ÑÑÑÑом новÑÑ
ÑÑанзакÑий (recent_transactions).
MERGE INTO customer_account ca USING recent_transactions t ON t.customer_id = ca.customer_id WHEN MATCHED THEN UPDATE SET balance = balance + transaction_value WHEN NOT MATCHED THEN INSERT (customer_id, balance) VALUES (t.customer_id, t.transaction_value);
ÐопÑÑка добавиÑÑ Ð½Ð¾Ð²Ñй пÑодÑÐºÑ Ð²Ð¼ÐµÑÑе Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑвом. ÐÑли ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ñже ÑÑÑеÑÑвÑеÑ, ÑвелиÑиваеÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво данного пÑодÑкÑа в ÑÑÑеÑÑвÑÑÑей запиÑи. ÐозиÑии Ñ Ð½ÑлевÑм колиÑеÑÑвом ÑдалÑÑÑÑÑ. ÐозвÑаÑаеÑÑÑ Ð¾Ð¿Ð¸Ñание вÑÐµÑ Ð²Ð½ÐµÑÑннÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹.
MERGE INTO wines w USING wine_stock_changes s ON s.winename = w.winename WHEN NOT MATCHED AND s.stock_delta > 0 THEN INSERT VALUES(s.winename, s.stock_delta) WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN UPDATE SET stock = w.stock + s.stock_delta WHEN MATCHED THEN DELETE RETURNING merge_action(), w.winename, old.stock AS old_stock, new.stock AS new_stock;
ТаблиÑа wine_stock_changes Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ, напÑимеÑ, вÑеменной ÑаблиÑей, недавно загÑÑженной в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
ÐзменÑеÑÑÑ wines в ÑооÑвеÑÑÑвии Ñ Ð½Ð¾Ð²Ñм ÑпиÑком, добавлÑÑÑÑÑ ÑÑÑоки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑоваÑа, обновлÑÑÑÑÑ Ð¿Ð¾Ð·Ð¸Ñии изменÑннÑÑ
ÑоваÑов и ÑдалÑÑÑÑÑ Ð²Ñе Ð²Ð¸Ð´Ñ Ð²Ð¸Ð½, оÑÑÑÑÑÑвÑÑÑие в новом ÑпиÑке.
MERGE INTO wines w USING new_wine_list s ON s.winename = w.winename WHEN NOT MATCHED BY TARGET THEN INSERT VALUES(s.winename, s.stock) WHEN MATCHED AND w.stock != s.stock THEN UPDATE SET stock = s.stock WHEN NOT MATCHED BY SOURCE THEN DELETE;
СовмеÑÑимоÑÑÑ
ÐÑа команда ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL.
ÐÑедложение WITH, Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ BY SOURCE и BY TARGET к дейÑÑвиÑм WHEN NOT MATCHED, DO NOTHING, а Ñакже пÑедложение RETURNING ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми ÑÑандаÑÑа SQL.