INSERT
INSERT â добавиÑÑ ÑÑÑоки в ÑаблиÑÑ
СинÑакÑиÑ
[ WITH [ RECURSIVE ]запÑоÑ_WITH[, ...] ] INSERT INTOимÑ_ÑаблиÑÑ[ ASпÑевдоним] [ (имÑ_ÑÑолбÑа[, ...] ) ] [ OVERRIDING { SYSTEM | USER } VALUE ] { DEFAULT VALUES | VALUES ( {вÑÑажение| DEFAULT } [, ...] ) [, ...] |query} [ ON CONFLICT [обÑекÑ_конÑликÑа]дейÑÑвие_пÑи_конÑликÑе] [ RETURNING { * |вÑÑажение_ÑезÑлÑÑаÑа[ [ AS ]имÑ_ÑезÑлÑÑаÑа] } [, ...] ] ÐдеÑÑ Ð´Ð¾Ð¿ÑÑкаеÑÑÑобÑекÑ_конÑликÑа: ( {имÑ_ÑÑолбÑа_индекÑа| (вÑÑажение_индекÑа) } [ COLLATEпÑавило_ÑоÑÑиÑовки] [клаÑÑ_опеÑаÑоÑов] [, ...] ) [ WHEREпÑедикаÑ_индекÑа] ON CONSTRAINTимÑ_огÑаниÑениÑидейÑÑвие_пÑи_конÑликÑÐµÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим: DO NOTHING DO UPDATE SET {имÑ_ÑÑолбÑа= {вÑÑажение| DEFAULT } | (имÑ_ÑÑолбÑа[, ...] ) = [ ROW ] ( {вÑÑажение| DEFAULT } [, ...] ) | (имÑ_ÑÑолбÑа[, ...] ) = (вложеннÑй_SELECT) } [, ...] [ WHEREÑÑловие]
ÐпиÑание
INSERT добавлÑÐµÑ ÑÑÑоки в ÑаблиÑÑ. ÐÑа команда Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко ÑÑÑок, ÑÑоÑмиÑованнÑÑ
вÑÑажениÑми знаÑений, либо Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более ÑÑÑок, вÑданнÑÑ
дополниÑелÑнÑм запÑоÑом.
Ðмена ÑелевÑÑ
ÑÑолбÑов могÑÑ Ð¿ÐµÑеÑиÑлÑÑÑÑÑ Ð² лÑбом поÑÑдке. ÐÑли ÑпиÑок Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑÑолбÑов оÑÑÑÑÑÑвÑеÑ, по ÑмолÑÐ°Ð½Ð¸Ñ ÑелевÑми ÑÑолбÑами ÑÑановÑÑÑÑ Ð²Ñе ÑÑолбÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ; либо пеÑвÑе N из ниÑ
, еÑли ÑолÑко N ÑÑолбÑов поÑÑÑÐ¿Ð°ÐµÑ Ð¾Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ VALUES или запÑоÑа. ÐнаÑениÑ, полÑÑаемÑе Ð¾Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ VALUES или запÑоÑа, ÑвÑзÑваÑÑÑÑ Ñ Ñвно или неÑвно опÑеделÑннÑм ÑпиÑком ÑÑолбÑов Ñлева напÑаво.
ÐÑе ÑÑолбÑÑ, не пÑедÑÑавленнÑе в Ñвном или неÑвном ÑпиÑке ÑÑолбÑов, полÑÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, еÑли Ð´Ð»Ñ Ð½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ñ ÑÑи знаÑениÑ, либо NULL в пÑоÑивном ÑлÑÑае.
ÐÑли вÑÑажение Ð´Ð»Ñ Ð»Ñбого ÑÑолбÑа вÑдаÑÑ Ð´ÑÑгой Ñип даннÑÑ , ÑиÑÑема попÑÑаеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑивеÑÑи его к нÑжномÑ.
ÐпеÑаÑÐ¸Ñ INSERT Ñ ÑаблиÑами без ÑникалÑнÑÑ
индекÑов не блокиÑÑеÑÑÑ Ð¿Ð°ÑаллелÑно вÑполнÑемÑми опеÑаÑиÑми. Ð ÑаблиÑаÑ
Ñ ÑникалÑнÑми индекÑами ÑÑа опеÑаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑÑÑ, еÑли в паÑаллелÑнÑÑ
ÑеанÑаÑ
вÑполнÑÑÑÑÑ Ð´ÐµÐ¹ÑÑвиÑ, коÑоÑÑе блокиÑÑÑÑ Ð¸Ð»Ð¸ изменÑÑÑ ÑÑÑоки, ÑовпадаÑÑие Ñ Ð²ÑÑавлÑемÑми знаÑениÑми в ÑникалÑном индекÑе; подÑобнее Ñм. Раздел 61.5. ÐÑедложение ON CONFLICT позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð´ÐµÐ¹ÑÑвие, заменÑÑÑее возникновение оÑибки пÑи наÑÑÑении огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи или огÑаниÑениÑ-иÑклÑÑениÑ. (См. опиÑание ÐÑедложение ON CONFLICT ниже.)
С необÑзаÑелÑнÑм пÑедложением RETURNING команда INSERT вÑÑиÑÐ»Ð¸Ñ Ð¸ возвÑаÑÐ¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑакÑиÑеÑки добавленной ÑÑÑоки (или изменÑнной, еÑли пÑименÑлоÑÑ Ð¿Ñедложение ON CONFLICT DO UPDATE). РоÑновном ÑÑо полезно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений, пÑиÑвоеннÑÑ
по ÑмолÑаниÑ, напÑимеÑ, поÑледоваÑелÑного номеÑа запиÑи. Ðднако в ÑÑом пÑедложении можно задаÑÑ Ð»Ñбое вÑÑажение Ñо ÑÑолбÑами ÑаблиÑÑ. СпиÑок RETURNING Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и ÑпиÑок ÑезÑлÑÑаÑов SELECT. Ð ÑезÑлÑÑаÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ñе ÑÑÑоки, коÑоÑÑе бÑли ÑÑпеÑно вÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ измененÑ. ÐапÑимеÑ, еÑли ÑÑÑока бÑла заблокиÑована, но не изменена, из-за Ñого, ÑÑо ÑÑловие в пÑедложении ON CONFLICT DO UPDATE ... WHERE не ÑдовлеÑвоÑено, ÑÑа ÑÑÑока возвÑаÑена не бÑдеÑ.
ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ ÑÑÑоки в ÑаблиÑÑ, необÑ
одимо имеÑÑ Ð¿Ñаво INSERT Ð´Ð»Ñ Ð½ÐµÑ. ÐÑли пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение ON CONFLICT DO UPDATE, Ñакже ÑÑебÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð¿Ñаво UPDATE Ð´Ð»Ñ ÑÑой ÑаблиÑÑ.
ÐÑли ÑказÑваеÑÑÑ ÑпиÑок ÑÑолбÑов, доÑÑаÑоÑно имеÑÑ Ð¿Ñаво INSERT ÑолÑко Ð´Ð»Ñ Ð¿ÐµÑеÑиÑленнÑÑ
ÑÑолбÑов. ÐналогиÑно, Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE доÑÑаÑоÑно имеÑÑ Ð¿Ñаво UPDATE ÑолÑко Ð´Ð»Ñ ÑÑолбÑов, коÑоÑÑе бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. Ðднако пÑедложение ON CONFLICT DO UPDATE Ñакже ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¿Ñава SELECT Ð´Ð»Ñ Ð²ÑеÑ
ÑÑолбÑов, знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑиÑÑваÑÑÑÑ Ð² вÑÑажениÑÑ
ON CONFLICT DO UPDATE или в ÑÑловии.
ÐÐ»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RETURNING ÑÑебÑеÑÑÑ Ð¿Ñаво SELECT Ð´Ð»Ñ Ð²ÑеÑ
ÑÑолбÑов, пеÑеÑиÑленнÑÑ
в RETURNING. ÐÑли Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑок пÑименÑеÑÑÑ Ð·Ð°Ð¿ÑоÑ, Ð´Ð»Ñ Ð²ÑеÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸Ð»Ð¸ ÑÑолбÑов, задейÑÑвованнÑÑ
в ÑÑом запÑоÑе, ÑазÑмееÑÑÑ, необÑ
одимо имеÑÑ Ð¿Ñаво SELECT.
ÐаÑамеÑÑÑ
Ðобавление
Ð ÑÑом Ñазделе ÑаÑÑмаÑÑиваÑÑÑÑ Ð¿Ð°ÑамеÑÑÑ, пÑименÑемÑе ÑолÑко пÑи добавлении новÑÑ
ÑÑÑок. ÐаÑамеÑÑÑ, пÑименÑемÑе иÑклÑÑиÑелÑно Ñ Ð¿Ñедложением ON CONFLICT, опиÑÑваÑÑÑÑ Ð¾ÑделÑно.
запÑоÑ_WITHÐÑедложение
WITHпозволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко подзапÑоÑов, на коÑоÑÑе заÑем можно ÑÑÑлаÑÑÑÑ Ð¿Ð¾ имени в запÑоÑеINSERT. ÐодÑобнее об ÑÑом Ñм. Раздел 7.8 и SELECT.ÐаданнÑй
запÑоÑ(опеÑаÑоÑSELECT) Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑедложениеWITH. Ð ÑÑом ÑлÑÑае взапÑоÑеможно обÑаÑаÑÑÑÑ Ðº обоимзапÑоÑам_WITH, но вÑоÑой бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑиоÑиÑеÑ, Ñак как он вложен ближе.имÑ_ÑаблиÑÑÐÐ¼Ñ ÑÑÑеÑÑвÑÑÑей ÑаблиÑÑ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
пÑевдонимÐлÑÑеÑнаÑивное имÑ, заменÑÑÑее
имÑ_ÑаблиÑÑ. Ðогда ÑказÑваеÑÑÑ ÑÑÐ¾Ñ Ð¿Ñевдоним, он полноÑÑÑÑ ÑкÑÑÐ²Ð°ÐµÑ ÑеалÑное Ð¸Ð¼Ñ ÑаблиÑÑ. ÐÑо оÑобенно полезно, когда в пÑедложенииON CONFLICT DO UPDATEÑигÑÑиÑÑÐµÑ ÑаблиÑа Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼excluded, Ñак как без опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñевдонима ÑÑо Ð¸Ð¼Ñ Ð±ÑÐ´ÐµÑ Ð¾Ñдано ÑпеÑиалÑной ÑаблиÑе, пÑедÑÑавлÑÑÑей ÑÑÑокÑ, пÑедназнаÑеннÑÑ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ.имÑ_ÑÑолбÑаÐÐ¼Ñ ÑÑолбÑа в ÑаблиÑе
имÑ_ÑаблиÑÑ. ÐÑо Ð¸Ð¼Ñ ÑÑолбÑа пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ именем вложенного Ð¿Ð¾Ð»Ñ Ð¸Ð»Ð¸ индекÑом в маÑÑиве. (Ðогда даннÑе вÑÑавлÑÑÑÑÑ ÑолÑко в некоÑоÑÑе Ð¿Ð¾Ð»Ñ ÑÑолбÑа ÑоÑÑавного Ñипа, в дÑÑгие Ð¿Ð¾Ð»Ñ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑ NULL.) ÐбÑаÑаÑÑÑ Ðº ÑÑолбÑÑ Ð² пÑедложенииON CONFLICT DO UPDATE, вклÑÑаÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ Ð² ÑÑÑÐ»ÐºÑ Ð½Ð° Ñелевой ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ нÑжно. ÐапÑимеÑ, запиÑÑINSERT INTO table_name ... ON CONFLICT DO UPDATE SET table_name.col = 1некоÑÑекÑна (ÑÑо ÑоглаÑÑеÑÑÑ Ñ Ð¾Ð±Ñим поведением командÑUPDATE).OVERRIDING SYSTEM VALUEÐез ÑÑого пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ допÑÑкаеÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ðµ Ñвного знаÑÐµÐ½Ð¸Ñ (оÑлиÑного оÑ
DEFAULT) Ð´Ð»Ñ ÑÑолбÑа иденÑиÑикаÑии, опÑеделÑнного Ñ Ñ Ð°ÑакÑеÑиÑÑикойGENERATED ALWAYS. Ðанное пÑедложение пеÑекÑÑÐ²Ð°ÐµÑ ÑÑо огÑаниÑение.OVERRIDING USER VALUEÐÑли ÑказÑваеÑÑÑ ÑÑо пÑедложение, Ñо знаÑениÑ, пÑедÑÑавлÑемÑе Ð´Ð»Ñ ÑÑолбÑов иденÑиÑикаÑии, опÑеделÑннÑÑ Ñ Ñ Ð°ÑакÑеÑиÑÑикой
GENERATED BY DEFAULT, игноÑиÑÑÑÑÑÑ Ð¸ вмеÑÑо Ð½Ð¸Ñ Ð¿ÑименÑÑÑÑÑ Ð·Ð½Ð°ÑениÑ, вÑдаваемÑе поÑледоваÑелÑноÑÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ.ÐÑо пÑедложение полезно, напÑимеÑ, пÑи копиÑовании знаÑений Ð¼ÐµÐ¶Ð´Ñ ÑаблиÑами. Ðоманда
INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1ÑкопиÑÑÐµÑ Ð¸Ð·tbl1вÑе ÑÑолбÑÑ, кÑоме ÑÑолбÑов иденÑиÑикаÑии вtbl2, а знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов иденÑиÑикаÑии вtbl2бÑдÑÑ ÑгенеÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми вtbl2.DEFAULT VALUESÐÑе ÑÑолбÑÑ Ð¿Ð¾Ð»ÑÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. (ÐÑедложение
OVERRIDINGв ÑÑой ÑоÑме не допÑÑкаеÑÑÑ.)вÑÑажениеÐÑÑажение или знаÑение, коÑоÑое бÑÐ´ÐµÑ Ð¿ÑиÑвоено ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ ÑÑолбÑÑ.
DEFAULTСооÑвеÑÑÑвÑÑÑий ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾Ð»ÑÑÐ¸Ñ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ.
queryÐапÑÐ¾Ñ (опеÑаÑоÑ
SELECT), коÑоÑÑй вÑдаÑÑ ÑÑÑоки Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑаблиÑÑ. Ðго ÑинÑакÑÐ¸Ñ Ð¾Ð¿Ð¸Ñан в ÑпÑавке опеÑаÑоÑа SELECT.вÑÑажение_ÑезÑлÑÑаÑаÐÑÑажение, коÑоÑое бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð¸ возвÑаÑаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
INSERTпоÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки. Ð ÑÑом вÑÑажении можно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° лÑбÑÑ ÑÑолбÑов ÑаблиÑÑимÑ_ÑаблиÑÑ. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð²Ñе ÑÑолбÑÑ, доÑÑаÑоÑно напиÑаÑÑ*.имÑ_ÑезÑлÑÑаÑаÐмÑ, назнаÑаемое возвÑаÑÐ°ÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ.
ÐÑедложение ON CONFLICT
ÐеобÑзаÑелÑное пÑедложение ON CONFLICT задаÑÑ Ð´ÐµÐ¹ÑÑвие, заменÑÑÑее возникновение оÑибки пÑи наÑÑÑении огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи или огÑаниÑениÑ-иÑклÑÑениÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ оÑделÑной ÑÑÑоки, пÑедложенной Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, добавление либо вÑполнÑеÑÑÑ ÑÑпеÑно, либо, еÑли наÑÑÑаеÑÑÑ ÑеÑаÑÑее огÑаниÑение или индекÑ, задаваемÑе как обÑекÑ_конÑликÑа, вÑполнÑеÑÑÑ Ð°Ð»ÑÑеÑнаÑивное дейÑÑвие_конÑликÑа. ÐаÑÐ¸Ð°Ð½Ñ ON CONFLICT DO NOTHING в каÑеÑÑве алÑÑеÑнаÑивного дейÑÑÐ²Ð¸Ñ Ð¿ÑоÑÑо оÑменÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ ÑÑÑоки. ÐаÑÐ¸Ð°Ð½Ñ ON CONFLICT DO UPDATE изменÑÐµÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑÑÑокÑ, вÑзвавÑÑÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ Ñо ÑÑÑокой, пÑедложенной Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ.
ÐадаваемÑй обÑекÑ_конÑликÑа Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбиÑаÑÑ ÑникалÑнÑй индекÑ. ÐпÑеделение обÑекÑа, позволÑÑÑее вÑбÑаÑÑ Ð¸Ð½Ð´ÐµÐºÑ, вклÑÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко ÑÑолбÑов (иÑ
опÑеделÑÐµÑ Ð¸Ð¼Ñ_ÑÑолбÑа_индекÑа) и/или вÑÑажение_индекÑа и необÑзаÑелÑнÑй пÑедикаÑ_индекÑа. ÐÑе ÑникалÑнÑе индекÑÑ Ð² ÑаблиÑе имÑ_ÑаблиÑÑ, коÑоÑÑе, без ÑÑÑÑа поÑÑдка ÑÑолбÑов, ÑодеÑÐ¶Ð°Ñ Ð² ÑоÑноÑÑи ÑÑолбÑÑ/вÑÑажениÑ, опÑеделÑÑÑие обÑекÑ_конÑликÑа, вÑбиÑаÑÑÑÑ ÐºÐ°Ðº ÑеÑаÑÑие индекÑÑ. ÐÑли ÑказÑваеÑÑÑ Ð¿ÑедикаÑ_индекÑа, он должен, в каÑеÑÑве дополниÑелÑного ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑбоÑа, ÑдовлеÑвоÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑам. ÐамеÑÑÑе, ÑÑо ÑÑо ознаÑаеÑ, ÑÑо не ÑаÑÑиÑнÑй ÑникалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ (ÑникалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· пÑедикаÑа) бÑÐ´ÐµÑ Ð²ÑбÑан (и бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² ON CONFLICT), еÑли Ñакой Ð¸Ð½Ð´ÐµÐºÑ ÑдовлеÑвоÑÑÐµÑ Ð²Ñем оÑÑалÑнÑм кÑиÑеÑиÑм. ÐÑли попÑÑка вÑбÑаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð½ÐµÑдаÑной, вÑдаÑÑÑÑ Ð¾Ñибка.
ON CONFLICT DO UPDATE гаÑанÑиÑÑÐµÑ Ð°ÑомаÑнÑй ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT или UPDATE; пÑи оÑÑÑÑÑÑвии внеÑниÑ
оÑибок гаÑанÑиÑÑеÑÑÑ Ð¾Ð´Ð¸Ð½ из двÑÑ
ÑÑиÑ
иÑÑ
одов, даже пÑи болÑÑой паÑаллелÑной акÑивноÑÑи. ÐÑа опеÑаÑÐ¸Ñ Ñакже извеÑÑна как UPSERT â «UPDATE или INSERT».
обÑекÑ_конÑликÑаÐпÑеделÑеÑ, Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ именно конÑликÑа в
ON CONFLICTбÑÐ´ÐµÑ Ð¿ÑедпÑинÑÑо алÑÑеÑнаÑивное дейÑÑвие, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ ÑеÑаÑÑие индекÑÑ. ÐÑо Ñказание позволÑÐµÑ Ð¾ÑÑÑеÑÑвиÑÑ Ð²ÑÐ±Ð¾Ñ ÑникалÑного индекÑа или Ñвно задаÑÑ Ð¸Ð¼Ñ Ð¾Ð³ÑаниÑениÑ. ÐлÑON CONFLICT DO NOTHINGобÑекÑ_конÑликÑÐ°Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑказÑваÑÑÑÑ; в ÑÑом ÑлÑÑае игноÑиÑоваÑÑÑÑ Ð±ÑдÑÑ Ð²Ñе конÑликÑÑ Ñ Ð»ÑбÑми огÑаниÑениÑми (и ÑникалÑнÑми индекÑами). ÐлÑON CONFLICT DO UPDATEобÑекÑ_конÑликÑадолжен ÑказÑваÑÑÑÑ.дейÑÑвие_пÑи_конÑликÑеÐаÑамеÑÑ
дейÑÑвие_пÑи_конÑликÑезадаÑÑ Ð°Ð»ÑÑеÑнаÑивное дейÑÑвие в ÑлÑÑае конÑликÑа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ð¸Ð±Ð¾DO NOTHING(не делаÑÑ Ð½Ð¸Ñего), либо пÑедложениеDO UPDATE(пÑоизвеÑÑи изменение), в коÑоÑом ÑказÑваÑÑÑÑ ÑоÑнÑе деÑали опеÑаÑииUPDATE, вÑполнÑемой в ÑлÑÑае конÑликÑа. ÐÑедложениÑSETиWHEREвON CONFLICT DO UPDATEмогÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑÑÑеÑÑвÑÑÑей ÑÑÑоке по имени ÑаблиÑÑ (или пÑевдонимÑ) или к ÑÑÑоке, пÑедлагаемой Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, иÑполÑзÑÑ ÑпеÑиалÑнÑÑ ÑаблиÑÑexcluded. ÐÐ»Ñ ÑÑÐµÐ½Ð¸Ñ ÑÑолбÑовexcludedÐ½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð¿ÑавоSELECTÐ´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑÑолбÑов в Ñелевой ÑаблиÑе.ÐамеÑÑÑе, ÑÑо ÑÑÑÐµÐºÑ Ð´ÐµÐ¹ÑÑвий вÑÐµÑ ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок
BEFORE INSERTоÑÑажаеÑÑÑ Ð² знаÑениÑÑexcluded, Ñак как в ÑезÑлÑÑаÑе ÑÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвий ÑÑÑока Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑклÑÑена из множеÑÑва добавлÑемÑÑ .имÑ_ÑÑолбÑа_индекÑаÐÐ¼Ñ ÑÑолбÑа в ÑаблиÑе
имÑ_ÑаблиÑÑ. ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑбоÑа ÑеÑаÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑов. ÐадаÑÑÑÑ Ð² ÑоÑмаÑеCREATE INDEX. ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑполнилÑÑ, Ð´Ð»Ñ ÑÑолбÑаимÑ_ÑÑолбÑа_индекÑаÑÑебÑеÑÑÑ Ð¿ÑавоSELECT.вÑÑажение_индекÑаÐодобно ÑказаниÑ
имÑ_ÑÑолбÑа_индекÑа, но пÑименÑеÑÑÑ Ð´Ð»Ñ Ð²ÑбоÑа индекÑа по вÑÑажениÑм Ñо ÑÑолбÑами ÑаблиÑÑимÑ_ÑаблиÑÑ, ÑигÑÑиÑÑÑÑим в опÑеделениÑÑ Ð¸Ð½Ð´ÐµÐºÑов (не по пÑоÑÑÑм ÑÑолбÑам). ÐадаÑÑÑÑ Ð² ÑоÑмаÑеCREATE INDEX. ÐÐ»Ñ Ð²ÑÐµÑ ÑÑолбÑов, к коÑоÑÑм обÑаÑаеÑÑÑвÑÑажение_индекÑа, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð¿ÑавоSELECT.пÑавило_ÑоÑÑиÑовкиÐогда задаÑÑÑÑ, ÑÑÑанавливаеÑ, ÑÑо ÑооÑвеÑÑÑвÑÑÑие
имÑ_ÑÑолбÑа_индекÑаиливÑÑажение_индекÑÐ°Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð¿ÑеделÑннÑй поÑÑдок ÑоÑÑиÑовки, ÑÑÐ¾Ð±Ñ ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð³ бÑÑÑ Ð²ÑбÑан. ÐбÑÑно ÑÑо Ñказание опÑÑкаеÑÑÑ, Ñак как Ð¾Ñ Ð¿Ñавил ÑоÑÑиÑовки ÑаÑе вÑего не завиÑиÑ, пÑоизойдÑÑ Ð»Ð¸ наÑÑÑение огÑаниÑений или неÑ. ÐадаÑÑÑÑ Ð² ÑоÑмаÑеCREATE INDEX.клаÑÑ_опеÑаÑоÑовÐогда задаÑÑÑÑ, ÑÑÑанавливаеÑ, ÑÑо ÑооÑвеÑÑÑвÑÑÑие
имÑ_ÑÑолбÑа_индекÑаиливÑÑажение_индекÑÐ°Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð¿ÑеделÑннÑй клаÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð³ бÑÑÑ Ð²ÑбÑан. ÐбÑÑно ÑÑо Ñказание опÑÑкаеÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо ÑеманÑика ÑавенÑÑва ÑаÑÑо вÑÑ Ñавно одна и Ñа же в ÑазнÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑов Ñипа, или поÑÐ¾Ð¼Ñ ÑÑо доÑÑаÑоÑно ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо заданнÑе ÑникалÑнÑе индекÑÑ Ð¸Ð¼ÐµÑÑ Ð°Ð´ÐµÐºÐ²Ð°Ñное опÑеделение ÑавенÑÑва. ÐадаÑÑÑÑ Ð² ÑоÑмаÑеCREATE INDEX.пÑедикаÑ_индекÑаÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑбоÑа ÑаÑÑиÑнÑÑ ÑникалÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑов. ÐÑбÑÐ°Ð½Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð»ÑбÑе индекÑÑ, ÑдовлеÑвоÑÑÑÑие пÑедикаÑÑ (пÑи ÑÑом они могÑÑ Ð½Ðµ бÑÑÑ ÑобÑÑвенно ÑаÑÑиÑнÑми индекÑами). ÐадаÑÑÑÑ Ð² ÑоÑмаÑе
CREATE INDEX. ÐÐ»Ñ Ð²ÑÐµÑ ÑÑолбÑов, задейÑÑвованнÑÑ Ð²Ð¿ÑедикаÑе_индекÑа, ÑÑебÑеÑÑÑ Ð¿ÑавоSELECT.имÑ_огÑаниÑениÑЯвно задаÑÑ ÑеÑаÑÑее огÑаниÑение по имени, ÑÑо заменÑÐµÑ Ð½ÐµÑвнÑй вÑÐ±Ð¾Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ индекÑа.
ÑÑловиеÐÑÑажение, вÑдаÑÑее знаÑение Ñипа
boolean. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ñ Ð±ÑдÑÑ ÑолÑко Ñе ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÑо вÑÑажение вÑдаÑÑtrue, Ñ Ð¾ÑÑ Ð¿Ñи вÑбоÑе дейÑÑвиÑON CONFLICT DO UPDATEзаблокиÑÑÑÑÑÑ Ð²Ñе ÑÑÑоки. ÐамеÑÑÑе, ÑÑоÑÑловиевÑÑиÑлÑеÑÑÑ Ð² конÑе, поÑле Ñого как конÑÐ»Ð¸ÐºÑ Ð±Ñл пÑизнан пÑеÑендÑÑÑим на вÑполнение изменениÑ.
ÐамеÑÑÑе, ÑÑо огÑаниÑениÑ-иÑклÑÑÐµÐ½Ð¸Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ ÑеÑаÑÑими в ON CONFLICT DO UPDATE. Ðо вÑеÑ
ÑлÑÑаÑÑ
в каÑеÑÑве ÑеÑаÑÑиÑ
поддеÑживаÑÑÑÑ ÑолÑко неоÑкладÑваемÑе (NOT DEFERRABLE) огÑаниÑÐµÐ½Ð¸Ñ Ð¸ ÑникалÑнÑе индекÑÑ.
Ðоманда INSERT Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE ÑвлÑеÑÑÑ Â«Ð´ÐµÑеÑминиÑованной». ÐÑо ознаÑаеÑ, ÑÑо ÑÑой команде не ÑазÑеÑено воздейÑÑвоваÑÑ Ð½Ð° лÑбÑÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð±Ð¾Ð»ÑÑе одного Ñаза; в ÑлÑÑае Ñакой ÑиÑÑаÑии Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка наÑÑÑÐµÐ½Ð¸Ñ Ð¼Ð¾ÑноÑÑи множеÑÑва. СÑÑоки, пÑедлагаемÑе Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´ÑблиÑоваÑÑÑÑ Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑов, огÑаниÑиваемÑÑ
ÑеÑаÑÑим индекÑом или огÑаниÑением.
ÐамеÑÑÑе, ÑÑо в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ðµ поддеÑживаеÑÑÑ ÑиÑÑаÑиÑ, когда конÑÑÑÑкÑÐ¸Ñ ON CONFLICT DO UPDATE ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT, пÑименÑемой к ÑекÑиониÑованной ÑаблиÑе, изменÑÐµÑ ÐºÐ»ÑÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² конÑликÑÑÑÑей ÑÑÑоке Ñак, ÑÑо ÑÑа ÑÑÑока должна бÑÑÑ Ð¿ÐµÑенеÑена в новÑÑ ÑекÑиÑ.
ÐодÑказка
ЧаÑÑо пÑедпоÑÑиÑелÑнее иÑполÑзоваÑÑ Ð½ÐµÑвнÑй вÑÐ±Ð¾Ñ ÑникалÑного индекÑа вмеÑÑо непоÑÑедÑÑвенного ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð² виде ON CONFLICT ON CONSTRAINT имÑ_огÑаниÑениÑ. ÐÑÐ±Ð¾Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÐºÐ¾ÑÑекÑно ÑабоÑаÑÑ, когда нижележаÑий Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ñн дÑÑгим более или менее ÑавнознаÑнÑм индекÑом меÑодом наложениÑ, напÑимеÑ, Ñ Ð¸ÑполÑзованием CREATE UNIQUE INDEX ... CONCURRENTLY и поÑледÑÑÑим Ñдалением заменÑемого индекÑа.
ÐÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
Ð ÑлÑÑае ÑÑпеÑного завеÑÑÐµÐ½Ð¸Ñ INSERT возвÑаÑÐ°ÐµÑ Ð¼ÐµÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² виде
INSERToidÑиÑло
ÐдеÑÑ ÑиÑло пÑедÑÑавлÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво добавленнÑÑ
или изменÑннÑÑ
ÑÑÑок. Ðоле oid вÑегда ÑодеÑÐ¶Ð¸Ñ 0 (ÑанÑÑе в нÑм вÑводилÑÑ OID, пÑиÑвоеннÑй добавленной ÑÑÑоке, когда ÑиÑло ÑавнÑлоÑÑ 1 и ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа бÑла Ñоздана Ñ Ñказанием WITH OIDS, а в пÑоÑивном ÑлÑÑае â 0; ÑепеÑÑ Ð¶Ðµ Ñоздание ÑаблиÑÑ Ñ Ñ
аÑакÑеÑиÑÑикой WITH OIDS не поддеÑживаеÑÑÑ).
ÐÑли команда INSERT ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение RETURNING, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ñ
ож на ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑа SELECT (Ñ Ñеми же ÑÑолбÑами и знаÑениÑми, ÑÑо ÑодеÑжаÑÑÑ Ð² ÑпиÑке RETURNING), полÑÑеннÑй Ð´Ð»Ñ ÑÑÑок, добавленнÑÑ
или изменÑннÑÑ
ÑÑой командой.
ÐÑимеÑаниÑ
ÐÑли ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа ÑвлÑеÑÑÑ ÑекÑиониÑованной, ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока пеÑенапÑавлÑеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑÑÑ ÑекÑÐ¸Ñ Ð¸ вÑÑавлÑеÑÑÑ Ð² неÑ. ÐÑли ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа ÑвлÑеÑÑÑ ÑекÑией и какаÑ-либо из Ð²Ñ Ð¾Ð´Ð½ÑÑ ÑÑÑок наÑÑÑÐ°ÐµÑ Ð¾Ð³ÑаниÑение ÑÑой ÑекÑии, пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ñибка.
ÐÑимеÑÑ
Ðобавление одной ÑÑÑоки в ÑаблиÑÑ films:
INSERT INTO films VALUES
('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');Ð ÑÑом пÑимеÑе ÑÑÐ¾Ð»Ð±ÐµÑ len опÑÑкаеÑÑÑ Ð¸, Ñаким обÑазом, полÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');Ð ÑÑом пÑимеÑе Ð´Ð»Ñ ÑÑолбÑа Ñ Ð´Ð°Ñой задаÑÑÑÑ Ñказание DEFAULT, а не Ñвное знаÑение:
INSERT INTO films VALUES
('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');Ðобавление ÑÑÑоки, полноÑÑÑÑ ÑоÑÑоÑÑей из знаÑений по ÑмолÑаниÑ:
INSERT INTO films DEFAULT VALUES;
Ðобавление неÑколÑкиÑ
ÑÑÑок Ñ Ð¸ÑполÑзованием многоÑÑÑоÑного ÑинÑакÑиÑа VALUES:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');Ð ÑÑом пÑимеÑе в ÑаблиÑÑ films вÑÑавлÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑÑÑоки из ÑаблиÑÑ tmp_films, имеÑÑей ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ ÑÑолбÑов, ÑÑо и films:
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ даннÑÑ Ð² ÑÑолбÑÑ Ñ Ñипом маÑÑива:
-- Создание пÑÑÑого Ð¿Ð¾Ð»Ñ 3x3 Ð´Ð»Ñ Ð¸Ð³ÑÑ Ð² кÑеÑÑики-нолики
INSERT INTO tictactoe (game, board[1:3][1:3])
VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- Ð£ÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов в пÑедÑдÑÑей команда могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑенÑ
INSERT INTO tictactoe (game, board)
VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');Ðобавление одной ÑÑÑоки в ÑаблиÑÑ distributors и полÑÑение поÑледоваÑелÑного номеÑа, ÑгенеÑиÑованного благодаÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ DEFAULT:
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING did;
УвелиÑение ÑÑÑÑÑика пÑодаж Ð´Ð»Ñ Ð¿ÑодавÑа, занимаÑÑегоÑÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ Acme Corporation, и ÑÐ¾Ñ Ñанение вÑей изменÑнной ÑÑÑоки вмеÑÑе Ñ ÑекÑÑим вÑеменем в ÑаблиÑе жÑÑнала:
WITH upd AS (
UPDATE employees SET sales_count = sales_count + 1 WHERE id =
(SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;ÐобавиÑÑ Ð´Ð¸ÑÑÑибÑÑÑоÑов или измениÑÑ ÑÑÑеÑÑвÑÑÑие даннÑе должнÑм обÑазом. ÐÑедполагаеÑÑÑ, ÑÑо в ÑаблиÑе опÑеделÑн ÑникалÑнÑй индекÑ, огÑаниÑиваÑÑий знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе did. ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº знаÑениÑм, изнаÑалÑно пÑедлагаемÑм Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, иÑполÑзÑеÑÑÑ ÑпеÑиалÑÐ½Ð°Ñ ÑаблиÑа excluded:
INSERT INTO distributors (did, dname)
VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname;ÐобавиÑÑ Ð´Ð¸ÑÑÑибÑÑÑоÑа или не делаÑÑ Ð½Ð¸Ñего Ð´Ð»Ñ ÑÑÑок, пÑедложеннÑÑ
Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, еÑли Ñже еÑÑÑ ÑÑÑеÑÑвÑÑÑÐ°Ñ Ð¸ÑклÑÑаÑÑÐ°Ñ ÑÑÑока (ÑÑÑока, ÑодеÑжаÑÐ°Ñ ÐºÐ¾Ð½ÑликÑÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе или ÑÑолбÑаÑ
поÑле ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑиггеÑов пеÑед добавлением ÑÑÑоки). Рданном пÑимеÑе пÑедполагаеÑÑÑ, ÑÑо опÑеделÑн ÑникалÑнÑй индекÑ, огÑаниÑиваÑÑий знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе did:
INSERT INTO distributors (did, dname) VALUES (7, 'Redline GmbH')
ON CONFLICT (did) DO NOTHING;ÐобавиÑÑ Ð´Ð¸ÑÑÑибÑÑÑоÑов или измениÑÑ ÑÑÑеÑÑвÑÑÑие даннÑе должнÑм обÑазом. Рданном пÑимеÑе пÑедполагаеÑÑÑ, ÑÑо в ÑаблиÑе опÑеделÑн ÑникалÑнÑй индекÑ, огÑаниÑиваÑÑий знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе did. ÐÑедложение WHERE позволÑÐµÑ Ð¾Ð³ÑаниÑиÑÑ Ð½Ð°Ð±Ð¾Ñ ÑакÑиÑеÑки изменÑемÑÑ
ÑÑÑок (однако лÑÐ±Ð°Ñ ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока, не подлежаÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, вÑÑ Ð¶Ðµ бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована):
-- Ðе менÑÑÑ Ð´Ð°Ð½Ð½Ñе ÑÑÑеÑÑвÑÑÑиÑ
диÑÑÑибÑÑÑоÑов в завиÑимоÑÑи Ð¾Ñ Ð¿Ð¾ÑÑового индекÑа
INSERT INTO distributors AS d (did, dname) VALUES (8, 'Anvil Distribution')
ON CONFLICT (did) DO UPDATE
SET dname = EXCLUDED.dname || ' (formerly ' || d.dname || ')'
WHERE d.zipcode <> '21201';
-- УказаÑÑ Ð¸Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в опеÑаÑоÑе (ÑвÑзаннÑй индекÑ
-- пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑинÑÑÐ¸Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¾ вÑполнении дейÑÑÐ²Ð¸Ñ DO NOTHING)
INSERT INTO distributors (did, dname) VALUES (9, 'Antwerp Design')
ON CONFLICT ON CONSTRAINT distributors_pkey DO NOTHING;ÐобавиÑÑ Ð´Ð¸ÑÑÑибÑÑÑоÑа, еÑли возможно; в пÑоÑивном ÑлÑÑае не делаÑÑ Ð½Ð¸Ñего (DO NOTHING). Рданном пÑимеÑе пÑедполагаеÑÑÑ, ÑÑо в ÑаблиÑе опÑеделÑн ÑникалÑнÑй индекÑ, огÑаниÑиваÑÑий знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑе did по подмножеÑÑÐ²Ñ ÑÑÑок, в коÑоÑом логиÑеÑкий ÑÑÐ¾Ð»Ð±ÐµÑ is_active ÑодеÑÐ¶Ð¸Ñ true:
-- ÐÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑаÑÑиÑнÑй ÑникалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ "did"
-- Ñ Ð¿ÑедикаÑом "WHERE is_active", а Ð¼Ð¾Ð¶ÐµÑ Ð¸ пÑоÑÑо иÑполÑзоваÑÑ
-- обÑÑное огÑаниÑение ÑникалÑноÑÑи по ÑÑолбÑÑ "did"
INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International')
ON CONFLICT (did) WHERE is_active DO NOTHING;СовмеÑÑимоÑÑÑ
INSERT ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL, но пÑедложение RETURNING оÑноÑиÑÑÑ Ðº ÑаÑÑиÑениÑм PostgreSQL, как и возможноÑÑÑ Ð¿ÑименÑÑÑ WITH Ñ INSERT и возможноÑÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð°Ð»ÑÑеÑнаÑивное дейÑÑвие Ñ ON CONFLICT. ÐÑоме Ñого, ÑиÑÑаÑиÑ, когда ÑпиÑок ÑÑолбÑов опÑÑен, но не вÑе ÑÑолбÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð· пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ VALUES или запÑоÑа, ÑÑандаÑÑом не допÑÑкаеÑÑÑ.
Ð ÑÑандаÑÑе SQL говоÑиÑÑÑ, ÑÑо пÑедложение OVERRIDING SYSTEM VALUE Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ, ÑолÑко еÑли ÑÑÑеÑÑвÑÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии, Ð´Ð»Ñ ÐºÐ¾ÑоÑого вÑегда генеÑиÑÑеÑÑÑ Ð·Ð½Ð°Ñение. PostgreSQL допÑÑÐºÐ°ÐµÑ ÑÑо пÑедложение в лÑбом ÑлÑÑае и игноÑиÑÑÐµÑ ÐµÐ³Ð¾ в ÑлÑÑае непÑименимоÑÑи.
ÐозможнÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÑпÑавке SELECT.