9.17. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми
Ð ÑÑом Ñазделе опиÑÐ°Ð½Ñ ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¾Ð±ÑекÑами, пÑедÑÑавлÑÑÑими поÑледоваÑелÑноÑÑи. Такие обÑекÑÑ (Ñакже назÑваемÑми генеÑаÑоÑами поÑледоваÑелÑноÑÑей или пÑоÑÑо поÑледоваÑелÑноÑÑÑми) ÑвлÑÑÑÑÑ ÑпеÑиалÑнÑми ÑаблиÑами из одной ÑÑÑоки и ÑоздаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE SEQUENCE. ÐÑполÑзÑÑÑÑÑ Ð¾Ð½Ð¸ обÑÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑникалÑнÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов ÑÑÑок ÑаблиÑÑ. ФÑнкÑии, пеÑеÑиÑленнÑе в ТаблиÑе 9.55, пÑедоÑÑавлÑÑÑ Ð¿ÑоÑÑÑе и безопаÑнÑе Ð´Ð»Ñ Ð¿Ð°ÑаллелÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾ÑеÑеднÑÑ Ð·Ð½Ð°Ñений ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей.
ТаблиÑа 9.55. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми
ФÑнкÑÐ¸Ñ ÐпиÑание |
|---|
ÐÑÐ¾Ð´Ð²Ð¸Ð³Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¿Ð¾ÑледоваÑелÑноÑÑи к ÑледÑÑÑÐµÐ¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸ возвÑаÑÐ°ÐµÑ ÑÑо знаÑение. ÐÑо дейÑÑвие аÑомаÑно: даже еÑли вÑзваÑÑ ÐÑой ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¿Ñаво |
УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ Ð¾Ð±ÑекÑа поÑледоваÑелÑноÑÑи ÑекÑÑее знаÑение и Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑÑÑановиÑÑ Ñлаг SELECT setval('myseq', 42); ÐÑи ÑледÑÑÑем вÑзове РезÑлÑÑаÑом ÐÑой ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¿Ñаво |
ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, вÑданное пÑи поÑледнем вÑзове ÐÑой ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¿Ñаво |
ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, вÑданное пÑи поÑледнем вÑзове ÐÑой ÑÑнкÑии ÑÑебÑеÑÑÑ Ð¿Ñаво |
Ðнимание
Ðо избежание блокиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ
ÑÑанзакÑий, пÑÑаÑÑиÑ
ÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ поÑледоваÑелÑноÑÑи, знаÑение, вÑданное ÑÑнкÑией nextval, не вÑÑвобождаеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²ÑоÑного иÑполÑзованиÑ, еÑли вÑзÑваÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð²Ð¿Ð¾ÑледÑÑвии пÑеÑÑваеÑÑÑ. ÐÑо ознаÑаеÑ, ÑÑо в ÑлÑÑае Ñбоев Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
или пÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑанзакÑий в поÑледоваÑелÑноÑÑи задейÑÑвованнÑÑ
знаÑений могÑÑ Ð¿Ð¾ÑвлÑÑÑÑÑ Ð¿ÑопÑÑки. ÐÑопÑÑки могÑÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð¸ без пÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑанзакÑии. ÐапÑимеÑ, команда INSERT Ñ Ð¿Ñедложением ON CONFLICT вÑÑиÑÐ»Ð¸Ñ ÐºÐ¾ÑÑеж, пÑеÑендÑÑÑий на добавление, пÑÐ¾Ð¸Ð·Ð²ÐµÐ´Ñ Ð²Ñе ÑÑебÑемÑе вÑÐ·Ð¾Ð²Ñ nextval, пÑежде Ñем вÑÑÐ²Ð¸Ñ ÐºÐ¾Ð½ÑликÑÑ, коÑоÑÑе могÑÑ Ð¿ÑивеÑÑи к оÑÑабоÑке пÑавил ON CONFLICT вмеÑÑо добавлениÑ. Таким обÑазом, обÑекÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑей Postgres Pro не годÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¿ÑеÑÑвнÑÑ
поÑледоваÑелÑноÑÑей.
Ð Ñом же клÑÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи, пÑоизведÑннÑе ÑÑнкÑией setval, ÑÑÐ°Ð·Ñ Ð¶Ðµ ÑÑановÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñми Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑÑанзакÑий и не оÑменÑÑÑÑÑ Ð¿Ñи оÑкаÑе ÑÑанзакÑии, вÑзвавÑей ÑÑÑ ÑÑнкÑиÑ.
ÐÑли клаÑÑÐµÑ Ð±Ð°Ð·Ñ Ð¿ÑеÑÑÐ²Ð°ÐµÑ ÑабоÑÑ Ð´Ð¾ ÑикÑаÑии ÑÑанзакÑии, ÑодеÑжаÑей вÑзов ÑÑнкÑии nextval или setval, изменение ÑоÑÑоÑÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ попаÑÑÑ Ð² поÑÑоÑнное Ñ
ÑанилиÑе, поÑÑÐ¾Ð¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑно, какое ÑоÑÑоÑние бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð¿Ð¾Ñле пеÑезапÑÑка клаÑÑеÑа: иÑÑ
одное или изменÑнное. ÐÑо не ÑоздаÑÑ Ð¿Ñоблем пÑи иÑполÑзовании поÑледоваÑелÑноÑÑи внÑÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, Ñак как дÑÑгие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ·Ð°ÑикÑиÑованнÑÑ
ÑÑанзакÑий Ñакже не бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ. Ðднако еÑли знаÑение поÑледоваÑелÑноÑÑи бÑÐ´ÐµÑ ÑоÑ
ÑанÑÑÑÑÑ Ð¸ иÑполÑзоваÑÑÑÑ Ð²Ð½Ðµ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑледÑÐµÑ Ð¿ÑедваÑиÑелÑно ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо вÑзов ÑÑнкÑии nextval ÑÑпеÑно заÑикÑиÑован.
ÐоÑледоваÑелÑноÑÑÑ, Ñ ÐºÐ¾ÑоÑой бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð»ÑÐ±Ð°Ñ Ð¸Ð· вÑÑеопиÑаннÑÑ
ÑÑнкÑий, опÑеделÑеÑÑÑ Ð°ÑгÑменÑом Ñипа regclass, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо OID поÑледоваÑелÑноÑÑи в ÑиÑÑемном каÑалоге pg_class. Ðднако вам не нÑжно вÑÑÑнÑÑ Ð²ÑÑиÑлÑÑÑ OID, Ñак как пÑоÑедÑÑа ввода знаÑÐµÐ½Ð¸Ñ regclass Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÑÑо за ваÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.19.