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