UPDATE
UPDATE â измениÑÑ ÑÑÑоки ÑаблиÑÑ
СинÑакÑиÑ
[ WITH [ RECURSIVE ]запÑоÑ_WITH[, ...] ] UPDATE [ ONLY ]имÑ_ÑаблиÑÑ[ * ] [ [ AS ]пÑевдоним] SET {имÑ_ÑÑолбÑа= {вÑÑажение| DEFAULT } | (имÑ_ÑÑолбÑа[, ...] ) = [ ROW ] ( {вÑÑажение| DEFAULT } [, ...] ) | (имÑ_ÑÑолбÑа[, ...] ) = (вложеннÑй_SELECT) } [, ...] [ FROMÑлеменÑ_FROM[, ...] ] [ WHEREÑÑловие| WHERE CURRENT OFимÑ_кÑÑÑоÑа] [ RETURNING [ WITH ( { OLD | NEW } ASпÑевдоним_ÑезÑлÑÑаÑа[, ...] ) ] { * |вÑÑажение_ÑезÑлÑÑаÑа[ [ AS ]имÑ_ÑезÑлÑÑаÑа] } [, ...] ]
ÐпиÑание
UPDATE изменÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑказаннÑÑ
ÑÑолбÑов во вÑеÑ
ÑÑÑокаÑ
, ÑдовлеÑвоÑÑÑÑиÑ
ÑÑловиÑ. РпÑедложении SET Ð´Ð¾Ð»Ð¶Ð½Ñ ÑказÑваÑÑÑÑ ÑолÑко Ñе ÑÑолбÑÑ, коÑоÑÑе бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ; ÑÑолбÑÑ, не изменÑемÑе Ñвно, ÑоÑ
ÑанÑÑÑ Ñвои пÑедÑдÑÑие знаÑениÑ.
ÐзмениÑÑ ÑÑÑоки в ÑаблиÑе, иÑполÑзÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· дÑÑгиÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð² базе даннÑÑ
, можно двÑÐ¼Ñ ÑпоÑобами: пÑименÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе запÑоÑÑ Ð¸Ð»Ð¸ Ñказав дополниÑелÑнÑе ÑаблиÑÑ Ð² пÑедложении FROM. ÐÑÐ±Ð¾Ñ Ð¿ÑедпоÑиÑаемого ваÑианÑа завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
обÑÑоÑÑелÑÑÑв.
ÐÑедложение RETURNING ÑказÑваеÑ, ÑÑо команда UPDATE должна вÑÑиÑлиÑÑ Ð¸ возвÑаÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑакÑиÑеÑки изменÑнной ÑÑÑоки. ÐÑÑиÑлиÑÑ Ð² нÑм можно лÑбое вÑÑажение Ñо ÑÑолбÑами Ñелевой ÑаблиÑÑ Ð¸/или ÑÑолбÑами дÑÑгиÑ
ÑаблиÑ, ÑпомÑнÑÑÑÑ
во FROM. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð² вÑÑажении бÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð½Ð¾Ð²Ñе (изменÑннÑе) знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов ÑаблиÑÑ, но Ñакже можно запÑоÑиÑÑ ÑÑаÑÑе (до изменениÑ) знаÑениÑ. СпиÑок RETURNING Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и ÑпиÑок ÑезÑлÑÑаÑов SELECT.
ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½ÐµÐ¾Ð±Ñ
одимо имеÑÑ Ð¿Ñаво UPDATE Ð´Ð»Ñ ÑаблиÑÑ, или как минимÑм Ð´Ð»Ñ ÑÑолбÑов, пеÑеÑиÑленнÑÑ
в ÑпиÑке изменÑемÑÑ
. Также необÑ
одимо имеÑÑ Ð¿Ñаво SELECT Ð´Ð»Ñ Ð²ÑеÑ
ÑÑолбÑов, знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑиÑÑваÑÑÑÑ Ð² вÑÑажениÑÑ
или ÑÑловии.
ÐаÑамеÑÑÑ
запÑоÑ_WITHÐÑедложение
WITHпозволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко подзапÑоÑов, на коÑоÑÑе заÑем можно ÑÑÑлаÑÑÑÑ Ð¿Ð¾ имени в запÑоÑеUPDATE. ÐодÑобнее об ÑÑом Ñм. Раздел 7.8 и SELECT.имÑ_ÑаблиÑÑÐÐ¼Ñ ÑаблиÑÑ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹), ÑÑÑоки коÑоÑой бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. ÐÑли пеÑед именем ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾
ONLY, ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки изменÑÑÑÑÑ ÑолÑко в Ñказанной ÑаблиÑе. ÐезONLYÑÑÑоки бÑдÑÑ Ñакже Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð²Ð¾ вÑÐµÑ ÑаблиÑÐ°Ñ , ÑнаÑледованнÑÑ Ð¾Ñ Ñказанной. ÐÑи желании, поÑле имени ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ*, ÑÑÐ¾Ð±Ñ Ñвно обознаÑиÑÑ, ÑÑо опеÑаÑÐ¸Ñ Ð·Ð°ÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð²Ñе доÑеÑние ÑаблиÑÑ.пÑевдонимÐлÑÑеÑнаÑивное Ð¸Ð¼Ñ Ñелевой ÑаблиÑÑ. Ðогда ÑказÑваеÑÑÑ ÑÑо имÑ, оно полноÑÑÑÑ ÑкÑÑÐ²Ð°ÐµÑ ÑакÑиÑеÑкое Ð¸Ð¼Ñ ÑаблиÑÑ. ÐапÑимеÑ, в запÑоÑе
UPDATE foo AS fдополниÑелÑнÑе компоненÑÑ Ð¾Ð¿ÐµÑаÑоÑаUPDATEÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº Ñелевой ÑаблиÑе по имениf, а неfoo.имÑ_ÑÑолбÑаÐÐ¼Ñ ÑÑолбÑа в ÑаблиÑе
имÑ_ÑаблиÑÑ. ÐÐ¼Ñ ÑÑолбÑа пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ именем вложенного Ð¿Ð¾Ð»Ñ Ð¸Ð»Ð¸ индекÑом маÑÑива. ÐÐ¼Ñ ÑаблиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ðº имени Ñелевого ÑÑолбÑа не нÑжно â напÑимеÑ, запиÑÑUPDATE table_name SET table_name.col = 1оÑибоÑна.вÑÑажениеÐÑÑажение, ÑезÑлÑÑÐ°Ñ ÐºÐ¾ÑоÑого пÑиÑваиваеÑÑÑ ÑÑолбÑÑ. Ð ÑÑом вÑÑажении можно иÑполÑзоваÑÑ Ð¿ÑедÑдÑÑие знаÑÐµÐ½Ð¸Ñ ÑÑого и дÑÑÐ³Ð¸Ñ ÑÑолбÑов ÑаблиÑÑ.
DEFAULTÐÑиÑвоиÑÑ ÑÑолбÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ NULL, еÑли Ð´Ð»Ñ ÑÑолбÑа не опÑеделено некоÑоÑое вÑÑажение по ÑмолÑаниÑ). СÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии пÑи ÑÑом полÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, вÑданное ÑооÑвеÑÑÑвÑÑÑей поÑледоваÑелÑноÑÑÑÑ. ÐÐ»Ñ Ð³ÐµÐ½ÐµÑиÑÑемого ÑÑолбÑа ÑÑо Ñказание допÑÑкаеÑÑÑ, но не менÑÐµÑ Ð¾Ð±ÑÑное поведение, Ñо еÑÑÑ Ð·Ð½Ð°Ñение ÑÑолбÑа вÑÑиÑлÑеÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑÑÑим вÑÑажением.
вложеннÑй_SELECTÐодзапÑоÑ
SELECT, вÑдаÑÑий ÑÑолÑко вÑÑ Ð¾Ð´Ð½ÑÑ ÑÑолбÑов, ÑколÑко пеÑеÑиÑлено в пÑедÑеÑÑвÑÑÑем ÐµÐ¼Ñ ÑпиÑке ÑÑолбÑов в ÑÐºÐ¾Ð±ÐºÐ°Ñ . ÐÑи вÑполнении ÑÑого подзапÑоÑа должна бÑÑÑ Ð¿Ð¾Ð»ÑÑена макÑимÑм одна ÑÑÑока. ÐÑли он вÑдаÑÑ Ð¾Ð´Ð½Ñ ÑÑÑокÑ, знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов в нÑм пÑиÑваиваÑÑÑÑ ÑелевÑм ÑÑолбÑам; еÑли же он не возвÑаÑÐ°ÐµÑ ÑÑÑокÑ, ÑелевÑм ÑÑолбÑам пÑиÑваиваеÑÑÑ NULL. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº пÑедÑдÑÑим знаÑениÑм ÑекÑÑей изменÑемой ÑÑÑоки в ÑаблиÑе.ÑлеменÑ_FROMТаблиÑное вÑÑажение, позволÑÑÑее обÑаÑаÑÑÑÑ Ð² ÑÑловии
WHEREи вÑÑажениÑÑ Ð½Ð¾Ð²ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ðº ÑÑолбÑам дÑÑÐ³Ð¸Ñ ÑаблиÑ. РнÑм иÑполÑзÑеÑÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑинÑакÑиÑ, ÑÑо и в пÑедложенииFROMопеÑаÑоÑаSELECT; напÑимеÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ Ð¿Ñевдоним Ð´Ð»Ñ ÑаблиÑÑ. ÐÐ¼Ñ Ñелевой ÑаблиÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑ Ð² пÑедложенииFROMнÑжно, ÑолÑко еÑли Ð²Ñ Ñ Ð¾ÑиÑе опÑеделиÑÑ Ð·Ð°Ð¼ÐºÐ½ÑÑое Ñоединение (в ÑÑом ÑлÑÑае Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ имени должен опÑеделÑÑÑÑÑ Ð¿Ñевдоним).ÑÑловиеÐÑÑажение, возвÑаÑаÑÑее знаÑение Ñипа
boolean. ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ñ Ð±ÑдÑÑ ÑолÑко Ñе ÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÑо вÑÑажение возвÑаÑаеÑtrue.имÑ_кÑÑÑоÑаÐÐ¼Ñ ÐºÑÑÑоÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑÑловии
WHERE CURRENT OF. С Ñаким ÑÑловием бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° ÑÑÑока, вÑбÑÐ°Ð½Ð½Ð°Ñ Ð¸Ð· ÑÑого кÑÑÑоÑа поÑледней. ÐÑÑÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ обÑазовÑваÑÑÑÑ Ð·Ð°Ð¿ÑоÑом, не пÑименÑÑÑим гÑÑппиÑовкÑ, к Ñелевой ÑаблиÑе командÑUPDATE. ÐамеÑÑÑе, ÑÑоWHERE CURRENT OFнелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð»Ð¾Ð³Ð¸ÑеÑким ÑÑловием. Ðа дополниÑелÑнÑми ÑведениÑми об иÑполÑзовании кÑÑÑоÑов ÑWHERE CURRENT OFобÑаÑиÑеÑÑ Ðº DECLARE.пÑевдоним_ÑезÑлÑÑаÑаÐеобÑзаÑелÑнÑй пÑевдоним Ð´Ð»Ñ ÑÑÑок
OLDилиNEWв ÑпиÑкеRETURNING.Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñелевой ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
OLD.илиимÑ_ÑÑолбÑаOLD.*, а новÑе â Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑNEW.илиимÑ_ÑÑолбÑаNEW.*. ÐÑли Ð·Ð°Ð´Ð°Ð½Ñ Ð¿ÑевдонимÑ, ÑÑи имена недоÑÑÑпнÑ, и обÑаÑаÑÑÑÑ Ðº знаÑениÑм нÑжно ÑеÑез пÑевдонимÑ, напÑимеÑRETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.вÑÑажение_ÑезÑлÑÑаÑаÐÑÑажение, коÑоÑое бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð¸ возвÑаÑаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
UPDATEпоÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки. Ð ÑÑом вÑÑажении можно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° лÑбÑÑ ÑÑолбÑов ÑаблиÑÑимÑ_ÑаблиÑÑили ÑаблиÑ, пеÑеÑиÑленнÑÑ Ð² ÑпиÑкеFROM. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð²Ñе ÑÑолбÑÑ, доÑÑаÑоÑно напиÑаÑÑ*.ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑаÑÑе или новÑе знаÑениÑ, можно дополниÑÑ Ð¸Ð¼Ñ ÑÑолбÑа или
*Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑOLDилиNEWили ÑооÑвеÑÑÑвÑÑÑегопÑевдонима_ÑезÑлÑÑаÑадлÑOLDилиNEW. ÐÑи иÑполÑзовании имени ÑÑолбÑа или*без дополнений или же имени ÑÑолбÑа или*, дополненнÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ или пÑевдонимом Ñелевой ÑаблиÑÑ, возвÑаÑаÑÑÑÑ Ð½Ð¾Ð²Ñе знаÑениÑ.имÑ_ÑезÑлÑÑаÑаÐмÑ, назнаÑаемое возвÑаÑÐ°ÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ.
ÐÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
Ð ÑлÑÑае ÑÑпеÑного завеÑÑениÑ, UPDATE возвÑаÑÐ°ÐµÑ Ð¼ÐµÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² виде
UPDATE ÑиÑло
ÐдеÑÑ ÑиÑло обознаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво изменÑннÑÑ
ÑÑÑок, вклÑÑÐ°Ñ Ñе подлежаÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑоки, знаÑÐµÐ½Ð¸Ñ Ð² коÑоÑÑÑ
не бÑли измененÑ. ÐамеÑÑÑе, ÑÑо ÑÑо ÑиÑло Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе колиÑеÑÑва ÑÑÑок, ÑдовлеÑвоÑÑÑÑиÑ
ÑÑловиÑ, когда Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑменÑÑÑÑÑ ÑÑиггеÑом BEFORE UPDATE. ÐÑли ÑиÑло Ñавно 0, даннÑй запÑÐ¾Ñ Ð½Ðµ изменил ни одной ÑÑÑоки (ÑÑо не ÑÑиÑаеÑÑÑ Ð¾Ñибкой).
ÐÑли команда UPDATE ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение RETURNING, ÐµÑ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ñ
ож на ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑа SELECT (Ñ Ñеми же ÑÑолбÑами и знаÑениÑми, ÑÑо ÑодеÑжаÑÑÑ Ð² ÑпиÑке RETURNING), полÑÑеннÑй Ð´Ð»Ñ ÑÑÑок, изменÑннÑÑ
ÑÑой командой.
ÐÑимеÑаниÑ
Ðогда пÑиÑÑÑÑÑвÑÐµÑ Ð¿Ñедложение FROM, ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа по ÑÑÑи ÑоединÑеÑÑÑ Ñ ÑаблиÑами, пеÑеÑиÑленнÑми в ÑлеменÑе_FROM, и ÐºÐ°Ð¶Ð´Ð°Ñ Ð²ÑÑ
Ð¾Ð´Ð½Ð°Ñ ÑÑÑока ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавлÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñелевой ÑаблиÑÑ. ÐÑименÑÑ Ð¿Ñедложение FROM, необÑ
одимо обеÑпеÑиÑÑ, ÑÑÐ¾Ð±Ñ Ñоединение вÑдавало макÑимÑм Ð¾Ð´Ð½Ñ Ð²ÑÑ
однÑÑ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, коÑоÑÑÑ Ð½Ñжно измениÑÑ. ÐÑÑгими Ñловами, ÑÐµÐ»ÐµÐ²Ð°Ñ ÑÑÑока не должна ÑоединÑÑÑÑÑ Ñ Ð±Ð¾Ð»ÐµÐµ Ñем одной ÑÑÑокой из дÑÑгиÑ
ÑаблиÑ. ÐÑли ÑÑо ÑÑловие наÑÑÑаеÑÑÑ, ÑолÑко одна из ÑÑÑок ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñелевой ÑÑÑоки, но ÐºÐ°ÐºÐ°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾, пÑедÑказаÑÑ Ð½ÐµÐ»ÑзÑ.
Ðз-за ÑÑой неопÑеделÑнноÑÑи надÑжнее ÑÑÑлаÑÑÑÑ Ð½Ð° дÑÑгие ÑаблиÑÑ ÑолÑко в подзапÑоÑÐ°Ñ , Ñ Ð¾ÑÑ Ñакие запÑоÑÑ ÑаÑÑо Ñ Ñже ÑиÑаÑÑÑÑ Ð¸ ÑабоÑаÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ, Ñем Ñоединение.
Ð ÑекÑиониÑованной ÑаблиÑе ÑÑÑока пÑи изменении Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеÑÑаÑÑ ÑдовлеÑвоÑÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑодеÑжаÑей ÐµÑ ÑекÑии. ÐÑи ÑÑом еÑли еÑÑÑ Ð´ÑÑÐ³Ð°Ñ ÑекÑÐ¸Ñ Ð² деÑеве ÑекÑиониÑованиÑ, огÑаниÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑой ÑÑа ÑÑÑока ÑдовлеÑвоÑÑеÑ, Ñо она пеÑеноÑиÑÑÑ Ð² даннÑÑ ÑекÑиÑ. ÐÑли Ñакой ÑекÑии неÑ, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñибка. Ðа кÑлиÑами пеÑемеÑение ÑÑÑоки вÑполнÑеÑÑÑ Ð¿Ð¾ÑÑедÑÑвом опеÑаÑий DELETE и INSERT.
СÑÑеÑÑвÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ñого, ÑÑо пÑи вÑполнении дÑÑгой паÑаллелÑной опеÑаÑии UPDATE или DELETE Ñ Ð¿ÐµÑемеÑаемой ÑÑÑокой Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка ÑеÑиализаÑии. ÐапÑимеÑ, пÑедположим, ÑÑо в ÑеанÑе 1 вÑполнÑеÑÑÑ UPDATE Ð´Ð»Ñ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ, а Ñем вÑеменем в паÑаллелÑном ÑеанÑе 2, в коÑоÑом ÑÑа ÑÑÑока видима, вÑполнÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ UPDATE или DELETE Ñ ÑÑой ÑÑÑокой. Ð ÑÑом ÑлÑÑае UPDATE/DELETE в ÑеанÑе 2 замеÑÐ¸Ñ Ð¿ÐµÑемеÑение ÑÑÑоки и вÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ ÑеÑиализаÑии (коÑоÑÐ°Ñ Ð²Ñегда пÑедÑÑавлÑеÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼ SQLSTATE '40001'). ÐолÑÑив ÑакÑÑ Ð¾ÑибкÑ, пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð¿ÑÑаÑÑÑÑ Ð¿Ð¾Ð²ÑоÑиÑÑ ÑÑанзакÑиÑ. РобÑÑном ÑлÑÑае, когда ÑаблиÑа не ÑекÑиониÑована или ÑÑÑока не пеÑемеÑаеÑÑÑ, в ÑеанÑе 2 видна изменÑÐ½Ð½Ð°Ñ ÑÑÑока, и опеÑаÑÐ¸Ñ UPDATE/DELETE вÑполнÑеÑÑÑ Ñ Ð½Ð¾Ð²Ð¾Ð¹ веÑÑией ÑÑÑоки.
ÐамеÑÑÑе, ÑÑо ÑÑÑоки могÑÑ Ð¿ÐµÑемеÑаÑÑÑÑ Ð¸Ð· локалÑнÑÑ ÑекÑий в ÑекÑÐ¸Ñ Ð² ÑÑоÑонней ÑаблиÑе (еÑли обÑÑÑка ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÐµÑенапÑавление коÑÑежей), но не из ÑекÑии в ÑÑоÑонней ÑаблиÑе в дÑÑгÑÑ ÑекÑиÑ.
ÐопÑÑка пеÑемеÑÑиÑÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· одной ÑекÑии в дÑÑгÑÑ Ð·Ð°Ð²ÐµÑÑиÑÑÑ Ð½ÐµÑдаÑей, еÑли обнаÑÑжиÑÑÑ, ÑÑо внеÑний клÑÑ Ð½Ð°Ð¿ÑÑмÑÑ ÑÑÑлаеÑÑÑ Ð½Ð° пÑедка иÑÑ
одной ÑекÑии, а в UPDATE ÑигÑÑиÑÑÐµÑ Ð½Ðµ ÑÑÐ¾Ñ Ð¿Ñедок.
ÐÑимеÑÑ
Ðзменение Ñлова Drama на Dramatic в ÑÑолбÑе kind ÑаблиÑÑ films:
UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';
Ðзменение знаÑений ÑемпеÑаÑÑÑÑ Ð¸ ÑбÑÐ¾Ñ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ñадков к знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð² одной ÑÑÑоке ÑаблиÑÑ weather:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03';
ÐÑполнение Ñой же опеÑаÑии Ñ Ð¿Ð¾Ð»ÑÑением изменÑннÑÑ Ð·Ð°Ð¿Ð¸Ñей и ÑÑаÑого знаÑÐµÐ½Ð¸Ñ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ñадков:
UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03' RETURNING temp_lo, temp_hi, prcp, old.prcp AS old_prcp;
Такое же изменение Ñ Ð¿Ñименением алÑÑеÑнаÑивного ÑинÑакÑиÑа Ñо ÑпиÑком ÑÑолбÑов:
UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT) WHERE city = 'San Francisco' AND date = '2003-07-03';
УвелиÑение ÑÑÑÑÑика пÑодаж Ð´Ð»Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑа, занимаÑÑегоÑÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸ÐµÐ¹ Acme Corporation, Ñ Ð¿Ñименением пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FROM:
UPDATE employees SET sales_count = sales_count + 1 FROM accounts WHERE accounts.name = 'Acme Corporation' AND employees.id = accounts.sales_person;
ÐÑполнение Ñой же опеÑаÑии, Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñм запÑоÑом в пÑедложении WHERE:
UPDATE employees SET sales_count = sales_count + 1 WHERE id = (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');
Ðзменение имени конÑакÑа в ÑаблиÑе ÑÑеÑов (ÑÑо должно бÑÑÑ Ð¸Ð¼Ñ Ð½Ð°Ð·Ð½Ð°Ñенного менеджеÑа по пÑодажам):
UPDATE accounts SET (contact_first_name, contact_last_name) =
(SELECT first_name, last_name FROM employees
WHERE employees.id = accounts.sales_person);ÐодобнÑй ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ, пÑименив Ñоединение:
UPDATE accounts SET contact_first_name = first_name,
contact_last_name = last_name
FROM employees WHERE employees.id = accounts.sales_person; Ðднако еÑли employees.id â не ÑникалÑнÑй клÑÑ, вÑоÑой запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð²Ð°ÑÑ Ð½ÐµÐ¿ÑедÑказÑемÑе ÑезÑлÑÑаÑÑ, Ñогда как пеÑвÑй запÑÐ¾Ñ Ð³Ð°ÑанÑиÑованно вÑдаÑÑ Ð¾ÑибкÑ, еÑли найдÑÑÑÑ Ð½ÐµÑколÑко запиÑей Ñ Ð¾Ð´Ð½Ð¸Ð¼ id. ÐÑоме Ñого, еÑли ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ accounts.sales_person не найдÑÑÑÑ, пеÑвÑй запÑÐ¾Ñ Ð·Ð°Ð¿Ð¸ÑÐµÑ Ð² Ð¿Ð¾Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ NULL, а вÑоÑой вовÑе не Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ ÑÑÑокÑ.
Ðбновление ÑÑаÑиÑÑики в Ñводной ÑаблиÑе в ÑооÑвеÑÑÑвии Ñ ÑекÑÑими даннÑми:
UPDATE summary s SET (sum_x, sum_y, avg_x, avg_y) =
(SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
WHERE d.group_id = s.group_id);ÐопÑÑка добавиÑÑ Ð½Ð¾Ð²Ñй пÑодÑÐºÑ Ð²Ð¼ÐµÑÑе Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑвом. ÐÑли ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ñже ÑÑÑеÑÑвÑеÑ, вмеÑÑо ÑÑого ÑвелиÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво данного пÑодÑкÑа в ÑÑÑеÑÑвÑÑÑей запиÑи. ЧÑÐ¾Ð±Ñ ÑеализоваÑÑ ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´, не оÑкаÑÑÐ²Ð°Ñ Ð²ÑÑ ÑÑанзакÑиÑ, можно иÑполÑзоваÑÑ ÑоÑки ÑÐ¾Ñ ÑанениÑ:
BEGIN;
-- дÑÑгие опеÑаÑии
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- ÐÑедполагаÑ, ÑÑо здеÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка из-за наÑÑÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи клÑÑа,
-- Ð¼Ñ Ð²ÑполнÑем ÑледÑÑÑие командÑ:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
-- ÐÑодолжение дÑÑгиÑ
опеÑаÑий и в завеÑÑение...
COMMIT;Ðзменение ÑÑолбÑа kind ÑаблиÑÑ films в ÑÑÑоке, на коÑоÑой в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñ
одиÑÑÑ ÐºÑÑÑÐ¾Ñ c_films:
UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
ÐдновÑеменное изменение болÑÑого колиÑеÑÑва ÑÑÑок Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÐ³Ð°Ñивно влиÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ, вÑзÑÐ²Ð°Ñ ÑаздÑвание ÑаблиÑ, оÑÑÑавание Ñеплики, повÑÑеннÑй ÑÑÐ¾Ð²ÐµÐ½Ñ ÐºÐ¾Ð½ÑликÑов блокиÑовок. Ð ÑакиÑ
ÑлÑÑаÑÑ
Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑии неболÑÑими поÑÑиÑми, заодно пÑименÑÑ Ðº ÑаблиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸. ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE Ð½ÐµÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LIMIT, но можно добиÑÑÑÑ Ð¿Ð¾Ñ
ожего ÑÑÑекÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐбÑиÑ
ÑаблиÑнÑÑ
вÑÑажений и замкнÑÑого ÑоединениÑ. ÐамкнÑÑое Ñоединение на ÑиÑÑемном ÑÑолбÑе ctid ÑÑÑекÑивно ÑабоÑÐ°ÐµÑ Ñо ÑÑандаÑÑнÑм ÑаблиÑнÑм меÑодом доÑÑÑпа PostgreSQL:
WITH exceeded_max_retries AS (
SELECT w.ctid FROM work_item AS w
WHERE w.status = 'active' AND w.num_retries > 10
ORDER BY w.retry_timestamp
FOR UPDATE
LIMIT 5000
)
UPDATE work_item SET status = 'failed'
FROM exceeded_max_retries AS emr
WHERE work_item.ctid = emr.ctid; ÐÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ñжно бÑÐ´ÐµÑ Ð¿Ð¾Ð²ÑоÑÑÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока не оÑÑанеÑÑÑ Ð½Ð¸ одной ÑÑÑоки, ÑÑебÑÑÑей изменениÑ. ÐÑедложение ORDER BY позволÑÐµÑ ÑказÑваÑÑ, какие ÑÑÑоки обновиÑÑ Ð¿ÐµÑвÑми. Ðно Ñакже Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð±Ð»Ð¾ÐºÐ¸Ñовок Ñ Ð´ÑÑгими опеÑаÑиÑми изменений, еÑли они запÑаÑиваÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки в одинаковом поÑÑдке. ÐÑли ÑÑÑеÑÑвÑÐµÑ Ð¾Ð¿Ð°ÑноÑÑÑ ÐºÐ¾Ð½ÑликÑа блокиÑовок, можно добавиÑÑ SKIP LOCKED к CTE, ÑÑÐ¾Ð±Ñ ÑазнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ðµ могли изменÑÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑÑокÑ. Ðднако в Ñаком ÑлÑÑае поÑÑебÑеÑÑÑ ÑиналÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° UPDATE без SKIP LOCKED или LIMIT, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо никакие ÑÑÑоки не бÑли пÑопÑÑенÑ.
СовмеÑÑимоÑÑÑ
ÐÑа команда ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL, за иÑклÑÑением пÑедложений FROM и RETURNING, коÑоÑÑе ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми PostgreSQL, как и возможноÑÑÑ Ð¿ÑименÑÑÑ WITH Ñ UPDATE.
РнекоÑоÑÑÑ
дÑÑгиÑ
СУÐÐ Ñакже поддеÑживаеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное пÑедложение FROM, но пÑедполагаеÑÑÑ, ÑÑо ÑÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа должна еÑÑ Ñаз ÑпоминаÑÑÑÑ Ð² ÑÑом пÑедложении. PostgreSQL воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿Ñедложение FROM не Ñак, поÑÑÐ¾Ð¼Ñ Ð±ÑдÑÑе внимаÑелÑнÑ, поÑÑиÑÑÑ Ð¿ÑиложениÑ, коÑоÑÑе иÑполÑзÑÑÑ ÑÑо ÑаÑÑиÑение ÑзÑка.
СоглаÑно ÑÑандаÑÑÑ, иÑÑ
однÑм знаÑением Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑпиÑка имÑн ÑÑолбÑов в ÑкобкаÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое вÑÑажение, вÑдаÑÑее ÑÑÑÐ¾ÐºÑ Ñ Ð½ÑжнÑм колиÑеÑÑвом ÑÑолбÑов. PostgreSQL пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве ÑÑого знаÑÐµÐ½Ð¸Ñ ÑолÑко конÑÑÑÑкÑÐ¾Ñ ÑÑÑоки или вложеннÑй SELECT. ÐзменÑемое знаÑение оÑделÑного ÑÑолбÑа можно обознаÑаÑÑ Ñловом DEFAULT в конÑÑÑÑкÑоÑе ÑÑÑоки, но не внÑÑÑи вложенного SELECT.