這篇文章主要介紹了postgresql 中的序列nextval詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧。
一、postgresql中的序列
1.1 場景需求
需要向下圖一樣,需要對產(chǎn)品編碼編碼設(shè)置一個序列。編碼規(guī)則 SKU + 序列號:
1.2 序列
序列是基于bigint算法的,因此范圍是不能超過一個八字節(jié) 整數(shù)的范圍(-9223372036854775808 到 9223372036854775807)。
由于nextval和setval調(diào)用絕不會回滾, 如果需要序數(shù)的"無間隙"分配,則不能使用序列對象。可以 通過在一個只包含一個計數(shù)器的表上使用排他鎖來構(gòu)建無間隙的分配, 但是這種方案比序列對象開銷更大,特別是當(dāng)有很多事務(wù)并發(fā)請求序數(shù)時
創(chuàng)建和使用語法:
CREATE SEQUENCE serial START 101;
SELECT nextval('serial');
nextval
---------
101
本節(jié)描述用于操作序列對象的函數(shù),序列對象也被稱為序列生成器或者就是序列。
序列對象都是用CREATE SEQUENCE創(chuàng)建的特殊的單行表。
序列對象通常用于為表的行生成唯一的標(biāo)識符。
表 中列出的這些序列函數(shù),可以為我們從序列對象中獲取連續(xù)的序列值提供了簡單的、多用戶安全的 方法。
獲取序列值是安全的,可以用來和其他鍵組合形成唯一主鍵。
補充:PostgreSQL中序列相關(guān)函數(shù) nextval、currval、lastval、setval、setval
PostgreSQL中序列主要涉及到的函數(shù)是
函數(shù)返回類型描述
nextval(regclass)bigint遞增序列對象到它的下一個數(shù)值并且返回該值。這個動作是自動完成的。即使多個會話并發(fā)運行nextval,每個進程也會安全地收到一個唯一的序列值。
currval(regclass)bigint在當(dāng)前會話中返回最近一次nextval抓到的該序列的數(shù)值。(如果在本會話中從未在該序列上調(diào)用過 nextval,那么會報告一個錯誤。)請注意因為此函數(shù)返回一個會話范圍的數(shù)值,而且也能給出一個可預(yù)計的結(jié)果,因此可以用于判斷其它會話是否執(zhí)行過nextval。
lastval()bigint返回當(dāng)前會話里最近一次nextval返回的數(shù)值。這個函數(shù)等效于currval,只是它不用序列名為參數(shù),它抓取當(dāng)前會話里面最近一次nextval使用的序列。如果當(dāng)前會話還沒有調(diào)用過nextval,那么調(diào)用lastval將會報錯。
setval(regclass, bigint)bigint重置序列對象的計數(shù)器數(shù)值。設(shè)置序列的last_value字段為指定數(shù)值并且將其is_called字段設(shè)置為true,表示下一次nextval將在返回數(shù)值之前遞增該序列。
setval(regclass, bigint, boolean)bigint重置序列對象的計數(shù)器數(shù)值。功能等同于上面的setval函數(shù),只是is_called可以設(shè)置為true或false。如果將其設(shè)置為false,那么下一次nextval將返回該數(shù)值,隨后的nextval才開始遞增該序列。
注意序列名中有大寫字母時,regclass參數(shù)值需要用雙引號括和單引號一起括起來,比如:
1select nextval('"ACT_ChecklistItem_Id_seq"');
除了setval函數(shù),還有另一種方法也是修改sequence的start_value,也是會更新序列的當(dāng)前值:
項目部署上去需要插入一些基礎(chǔ)數(shù)據(jù),所以新增數(shù)據(jù)的ID不是從1開始,修改sequence的start_value (下次執(zhí)行nextval得到的是start_value,而不是start_value+1) 。
1alter sequence s_seq restart with 2
相當(dāng)于
1select setval('s_seq',2,false)
文章來源:腳本之家
來源地址:https://www.jb51.net/article/205204.htm
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!