| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ðлава 9. ФÑнкÑии и опеÑаÑоÑÑ | След. |
9.16. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми
Ð ÑÑом Ñазделе опиÑÐ°Ð½Ñ ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¾Ð±ÑекÑами, пÑедÑÑавлÑÑÑими поÑледоваÑелÑноÑÑи. Такие обÑекÑÑ (Ñакже назÑваемÑми генеÑаÑоÑами поÑледоваÑелÑноÑÑей или пÑоÑÑо поÑледоваÑелÑноÑÑÑми) ÑвлÑÑÑÑÑ ÑпеÑиалÑнÑми ÑаблиÑами из одной ÑÑÑоки и ÑоздаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE SEQUENCE. ÐÑполÑзÑÑÑÑÑ Ð¾Ð½Ð¸ обÑÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑникалÑнÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов ÑÑÑок ÑаблиÑÑ. ФÑнкÑии, пеÑеÑиÑленнÑе в ТаблиÑе 9-44, пÑедоÑÑавлÑÑÑ Ð¿ÑоÑÑÑе и безопаÑнÑе Ð´Ð»Ñ Ð¿Ð°ÑаллелÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾ÑеÑеднÑÑ Ð·Ð½Ð°Ñений ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей.
ТаблиÑа 9-44. ФÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми
| ФÑнкÑÐ¸Ñ | Тип ÑезÑлÑÑаÑа | ÐпиÑание |
|---|---|---|
currval(regclass) | bigint | ÐÑдаÑÑ Ð·Ð½Ð°Ñение заданной поÑледоваÑелÑноÑÑи, коÑоÑое бÑло возвÑаÑено пÑи поÑледнем вÑзове ÑÑнкÑии nextval |
lastval() | bigint | ÐÑдаÑÑ Ð·Ð½Ð°Ñение лÑбой поÑледоваÑелÑноÑÑи, коÑоÑое бÑло возвÑаÑено пÑи поÑледнем вÑзове ÑÑнкÑии nextval |
nextval(regclass) | bigint | ÐÑÐ¾Ð´Ð²Ð¸Ð³Ð°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ðº ÑледÑÑÑÐµÐ¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸ возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾ |
setval(regclass, bigint) | bigint | УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑекÑÑее знаÑение поÑледоваÑелÑноÑÑи |
setval(regclass, bigint, boolean) | bigint | УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑекÑÑее знаÑение поÑледоваÑелÑноÑÑи и Ñлаг is_called, ÑказÑваÑÑий на Ñо, ÑÑо ÑÑо знаÑение иÑполÑзовалоÑÑ |
ÐоÑледоваÑелÑноÑÑÑ, к коÑоÑой бÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¾Ð´Ð½Ð° из ÑÑÐ¸Ñ ÑÑнкÑий, опÑеделÑеÑÑÑ Ð°ÑгÑменÑом 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.18.
ÐамеÑание: Ð PostgreSQL до веÑÑии 8.1 аÑгÑменÑÑ ÑÑÐ¸Ñ ÑÑнкÑий имели Ñип text, а не regclass, и поÑÑÐ¾Ð¼Ñ Ð¾Ð¿Ð¸Ñанное вÑÑе пÑеобÑазование ÑекÑÑовой ÑÑÑоки в OID имело меÑÑо пÑи каждом вÑзове ÑÑнкÑии. ÐÑо поведение ÑÐ¾Ñ ÑанÑеÑÑÑ Ð¸ ÑейÑÐ°Ñ Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи, но ÑейÑÐ°Ñ Ð¾Ð½Ð¾ Ñеализовано как неÑвное пÑиведение Ñипа text к ÑÐ¸Ð¿Ñ regclass пеÑед вÑзовом ÑÑнкÑии.
Ðогда Ð²Ñ Ð·Ð°Ð¿Ð¸ÑÑваеÑе аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии, ÑабоÑаÑÑей Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑÑ, как ÑекÑÑовÑÑ ÑÑÑÐ¾ÐºÑ Ð² ÑиÑÑом виде, она ÑÑановиÑÑÑ ÐºÐ¾Ð½ÑÑанÑой Ñипа regclass. Так как ÑакÑиÑеÑки ÑÑо бÑÐ´ÐµÑ Ð¿ÑоÑÑо знаÑение OID, оно бÑÐ´ÐµÑ Ð¿ÑивÑзано к изнаÑалÑно иденÑиÑиÑиÑованной поÑледоваÑелÑноÑÑи, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеименована, пеÑенеÑена в дÑÑгÑÑ ÑÑ ÐµÐ¼Ñ Ð¸ Ñ. д. Такое "Ñаннее ÑвÑзÑвание" обÑÑно желаÑелÑно Ð´Ð»Ñ ÑÑÑлок на поÑледоваÑелÑноÑÑи в знаÑениÑÑ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ пÑедÑÑавлениÑÑ . Ðо иногда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð² "позднем ÑвÑзÑвании", когда ÑÑÑлки на поÑледоваÑелÑноÑÑи ÑаÑпознаÑÑÑÑ Ð² пÑоÑеÑÑе вÑполнениÑ. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ñакое поведение, нÑжно пÑинÑдиÑелÑно измениÑÑ Ñип конÑÑанÑÑ Ñ regclass на text:
nextval('foo'::text) foo ÑаÑпознаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑÐамеÑÑÑе, ÑÑо веÑÑии PostgreSQL до 8.1 поддеÑживали ÑолÑко позднее ÑвÑзÑвание, Ñак ÑÑо ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ и Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñо ÑÑаÑÑми пÑиложениÑми.
ÐонеÑно же, аÑгÑменÑом ÑÐ°ÐºÐ¸Ñ ÑÑнкÑий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ ÑолÑко конÑÑанÑа, но и вÑÑажение. ÐÑли ÑÑо вÑÑажение ÑекÑÑового Ñипа, неÑвное пÑиведение Ñипов повлеÑÑÑ ÑазÑеÑение имени во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.
Ðиже опиÑÐ°Ð½Ñ Ð²Ñе ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми:
nextvalÐÑÐ¾Ð´Ð²Ð¸Ð³Ð°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ðº ÑледÑÑÑÐµÐ¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸ возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾. ÐÑо аÑомаÑÐ½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ: еÑли
nextvalвÑзÑваеÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно в неÑколÑÐºÐ¸Ñ ÑеанÑÐ°Ñ , в ÑезÑлÑÑаÑе каждого вÑзова бÑдÑÑ Ð³Ð°ÑанÑиÑованно полÑÑÐµÐ½Ñ ÑазнÑе знаÑениÑ.ÐÑли поÑледоваÑелÑноÑÑÑ ÑоздаÑÑÑÑ Ñ Ð¿Ð°ÑамеÑÑами по ÑмолÑаниÑ, ÑÑпеÑнÑе вÑзовÑ
nextvalполÑÑаÑÑ Ð¾ÑеÑеднÑе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ возÑаÑÑаниÑ, наÑÐ¸Ð½Ð°Ñ Ñ 1. ÐÑÑгое поведение можно полÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпеÑиалÑнÑÑ Ð¿Ð°ÑамеÑÑов в команде CREATE SEQUENCE; подÑобнее ÑÑо опиÑано на ÑÑÑаниÑе опиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ.Ðажно: Ðо Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ ÑÑанзакÑий, пÑÑаÑÑÐ¸Ñ ÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ поÑледоваÑелÑноÑÑи, опеÑаÑиÑ
nextvalникогда не оÑкаÑÑваеÑÑÑ; Ñ. е., как ÑолÑко знаÑение бÑло вÑбÑано, оно ÑÑиÑаеÑÑÑ Ð¸ÑполÑзованнÑм, даже еÑли ÑÑанзакÑиÑ, вÑполнивÑаÑnextval, позже бÑÐ´ÐµÑ Ð¿ÑеÑвана. ÐÑо ознаÑаеÑ, ÑÑо пÑеÑваннÑе ÑÑанзакÑии могÑÑ Ð¾ÑÑавлÑÑÑ "дÑÑÑ" в поÑледоваÑелÑноÑÑи задейÑÑвованнÑÑ Ð·Ð½Ð°Ñений.currvalÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, вÑданное пÑи поÑледнем вÑзове
nextvalÐ´Ð»Ñ ÑÑой поÑледоваÑелÑноÑÑи в ÑекÑÑем ÑеанÑе. (ÐÑли в данном ÑеанÑеnextvalни ÑÐ°Ð·Ñ Ð½Ðµ вÑзÑвалаÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ поÑледоваÑелÑноÑÑи, возвÑаÑаеÑÑÑ Ð¾Ñибка.) Так как ÑÑо знаÑение огÑаниÑено Ñамками ÑеанÑа, ÑÑа ÑÑнкÑÐ¸Ñ Ð²ÑдаÑÑ Ð¿ÑедÑказÑемÑй ÑезÑлÑÑÐ°Ñ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ñого, вÑзвалаÑÑ Ð»Ð¸ впоÑледÑÑвииnextvalв дÑÑÐ³Ð¸Ñ ÑеанÑÐ°Ñ Ð¸Ð»Ð¸ неÑ.lastvalÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, вÑданное пÑи поÑледнем вÑзове
nextvalв ÑекÑÑем ÑеанÑе. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°currval, но она не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² паÑамеÑÑÐ°Ñ Ð¸Ð¼Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи, а вÑдаÑÑ Ð·Ð½Ð°Ñение Ð´Ð»Ñ Ñой поÑледоваÑелÑноÑÑи, Ð´Ð»Ñ ÐºÐ¾ÑоÑойnextvalвÑзÑвалаÑÑ Ð² ÑекÑÑем ÑеанÑе в поÑледний Ñаз. ÐÑли в ÑекÑÑем ÑеанÑе ÑÑнкÑиÑnextvalеÑÑ Ð½Ðµ вÑзÑвалаÑÑ, пÑи вÑзовеlastvalпÑоизойдÑÑ Ð¾Ñибка.setvalСбÑаÑÑÐ²Ð°ÐµÑ ÑÑÑÑÑик поÑледоваÑелÑноÑÑи. Ð ÑоÑме Ñ Ð´Ð²ÑÐ¼Ñ Ð¿Ð°ÑамеÑÑами ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи заданное знаÑение Ð¿Ð¾Ð»Ñ last_value и знаÑение true Ð´Ð»Ñ Ñлага is_called, показÑваÑÑего, ÑÑо пÑи ÑледÑÑÑем вÑзове
nextvalпоÑледоваÑелÑноÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑнаÑала пÑодвинÑÑÑÑÑ Ðº оÑеÑÐµÐ´Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ, коÑоÑое бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено. ÐÑи ÑÑомcurrvalÑакже возвÑаÑÐ¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение. Ð ÑоÑме Ñ ÑÑÐµÐ¼Ñ Ð¿Ð°ÑамеÑÑами ÑÐ»Ð°Ð³Ñ is_called можно пÑиÑвоиÑÑ true или false. Со знаÑением true она дейÑÑвÑÐµÑ Ñак же, как и ÑоÑма Ñ Ð´Ð²ÑÐ¼Ñ Ð¿Ð°ÑамеÑÑами. ÐÑли же пÑиÑвоиÑÑ ÑÑÐ¾Ð¼Ñ ÑÐ»Ð°Ð³Ñ Ð·Ð½Ð°Ñение false, пеÑвÑй вÑзовnextvalпоÑле ÑÑого веÑнÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ заданное знаÑение, а пÑодвижение поÑледоваÑелÑноÑÑи пÑоизойдÑÑ Ð¿Ñи поÑледÑÑÑем вÑзовеnextval. ÐÑоме Ñого, знаÑение, возвÑаÑаемоеcurrvalв ÑÑом ÑлÑÑае, не менÑеÑÑÑ. ÐапÑимеÑ,SELECT setval('foo', 42); СледÑÑÑий вÑзовnextvalвеÑнÑÑ 43 SELECT setval('foo', 42, true); То же Ñамое SELECT setval('foo', 42, false); СледÑÑÑий вÑзовnextvalвеÑнÑÑ 42РезÑлÑÑаÑом Ñамой ÑÑнкÑии
setvalбÑÐ´ÐµÑ Ð¿ÑоÑÑо знаÑение ÐµÑ Ð²ÑоÑого аÑгÑменÑа.Ðажно: Так как знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей изменÑÑÑÑÑ Ð²Ð½Ðµ ÑÑанзакÑий, дейÑÑвие ÑÑнкÑии
setvalне оÑменÑеÑÑÑ Ð¿Ñи оÑкаÑе ÑÑанзакÑии.
| ÐÑед. | ÐаÑало | След. |
| ФÑнкÑии и опеÑаÑоÑÑ JSON | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | УÑловнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ |