postgresql 中的序列nextval詳解
一、postgresql中的序列
1.1 場(chǎng)景需求
需要向下圖一樣,需要對(duì)產(chǎn)品編碼編碼設(shè)置一個(gè)序列。編碼規(guī)則 SKU + 序列號(hào):
1.2 序列
序列是基于bigint算法的,因此范圍是不能超過(guò)一個(gè)八字節(jié) 整數(shù)的范圍(-9223372036854775808 到 9223372036854775807)。
由于nextval和setval調(diào)用絕不會(huì)回滾, 如果需要序數(shù)的"無(wú)間隙"分配,則不能使用序列對(duì)象。可以 通過(guò)在一個(gè)只包含一個(gè)計(jì)數(shù)器的表上使用排他鎖來(lái)構(gòu)建無(wú)間隙的分配, 但是這種方案比序列對(duì)象開(kāi)銷(xiāo)更大,特別是當(dāng)有很多事務(wù)并發(fā)請(qǐng)求序數(shù)時(shí)
創(chuàng)建和使用語(yǔ)法:
CREATE SEQUENCE serial START 101; SELECT nextval('serial'); nextval --------- 101
本節(jié)描述用于操作序列對(duì)象的函數(shù),序列對(duì)象也被稱(chēng)為序列生成器或者就是序列。
序列對(duì)象都是用CREATE SEQUENCE創(chuàng)建的特殊的單行表。
序列對(duì)象通常用于為表的行生成唯一的標(biāo)識(shí)符。
表 中列出的這些序列函數(shù),可以為我們從序列對(duì)象中獲取連續(xù)的序列值提供了簡(jiǎn)單的、多用戶(hù)安全的 方法。
獲取序列值是安全的,可以用來(lái)和其他鍵組合形成唯一主鍵。
補(bǔ)充:PostgreSQL中序列相關(guān)函數(shù) nextval、currval、lastval、setval、setval
PostgreSQL中序列主要涉及到的函數(shù)是
函數(shù) | 返回類(lèi)型 | 描述 |
nextval(regclass) | bigint | 遞增序列對(duì)象到它的下一個(gè)數(shù)值并且返回該值。這個(gè)動(dòng)作是自動(dòng)完成的。即使多個(gè)會(huì)話(huà)并發(fā)運(yùn)行nextval,每個(gè)進(jìn)程也會(huì)安全地收到一個(gè)唯一的序列值。 |
currval(regclass) | bigint | 在當(dāng)前會(huì)話(huà)中返回最近一次nextval抓到的該序列的數(shù)值。(如果在本會(huì)話(huà)中從未在該序列上調(diào)用過(guò) nextval,那么會(huì)報(bào)告一個(gè)錯(cuò)誤。)請(qǐng)注意因?yàn)榇撕瘮?shù)返回一個(gè)會(huì)話(huà)范圍的數(shù)值,而且也能給出一個(gè)可預(yù)計(jì)的結(jié)果,因此可以用于判斷其它會(huì)話(huà)是否執(zhí)行過(guò)nextval。 |
lastval() | bigint | 返回當(dāng)前會(huì)話(huà)里最近一次nextval返回的數(shù)值。這個(gè)函數(shù)等效于currval,只是它不用序列名為參數(shù),它抓取當(dāng)前會(huì)話(huà)里面最近一次nextval使用的序列。如果當(dāng)前會(huì)話(huà)還沒(méi)有調(diào)用過(guò)nextval,那么調(diào)用lastval將會(huì)報(bào)錯(cuò)。 |
setval(regclass, bigint) | bigint | 重置序列對(duì)象的計(jì)數(shù)器數(shù)值。設(shè)置序列的last_value字段為指定數(shù)值并且將其is_called字段設(shè)置為true,表示下一次nextval將在返回?cái)?shù)值之前遞增該序列。 |
setval(regclass, bigint, boolean) | bigint | 重置序列對(duì)象的計(jì)數(shù)器數(shù)值。功能等同于上面的setval函數(shù),只是is_called可以設(shè)置為true或false。如果將其設(shè)置為false,那么下一次nextval將返回該數(shù)值,隨后的nextval才開(kāi)始遞增該序列。 |
注意序列名中有大寫(xiě)字母時(shí),regclass參數(shù)值需要用雙引號(hào)括和單引號(hào)一起括起來(lái),比如:
select nextval('"ACT_ChecklistItem_Id_seq"');
除了setval函數(shù),還有另一種方法也是修改sequence的start_value,也是會(huì)更新序列的當(dāng)前值:
項(xiàng)目部署上去需要插入一些基礎(chǔ)數(shù)據(jù),所以新增數(shù)據(jù)的ID不是從1開(kāi)始,修改sequence的start_value (下次執(zhí)行nextval得到的是start_value,而不是start_value+1) 。
alter sequence s_seq restart with 2
相當(dāng)于
select setval('s_seq',2,false)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
查詢(xún)PostgreSQL占多大內(nèi)存的操作
這篇文章主要介紹了查詢(xún)PostgreSQL占多大內(nèi)存的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01PostgreSQL 設(shè)置允許訪(fǎng)問(wèn)IP的操作
這篇文章主要介紹了PostgreSQL 設(shè)置允許訪(fǎng)問(wèn)IP的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12PostgreSQL 實(shí)現(xiàn)給查詢(xún)列表增加序號(hào)操作
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)給查詢(xún)列表增加序號(hào)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01使用PostgreSQL為表或視圖創(chuàng)建備注的操作
這篇文章主要介紹了使用PostgreSQL為表或視圖創(chuàng)建備注的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01PostgreSQL有效地處理數(shù)據(jù)序列化和反序列化的方法
在 PostgreSQL 中,處理數(shù)據(jù)的序列化和反序列化是確保數(shù)據(jù)在存儲(chǔ)、傳輸和處理過(guò)程中的一致性和可用性的重要任務(wù),這涉及到選擇合適的數(shù)據(jù)類(lèi)型、轉(zhuǎn)換函數(shù)以及在應(yīng)用程序與數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)交互的策略,需要的朋友可以參考下2024-07-07Postgresql開(kāi)啟遠(yuǎn)程訪(fǎng)問(wèn)的步驟全紀(jì)錄
postgre一般默認(rèn)為本地連接,不支持遠(yuǎn)程訪(fǎng)問(wèn),所以如果要開(kāi)啟遠(yuǎn)程訪(fǎng)問(wèn),需要更改安裝文件的配置。下面這篇文章主要給大家介紹了關(guān)于Postgresql開(kāi)啟遠(yuǎn)程訪(fǎng)問(wèn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2018-03-03