PostgreSQL建立自增主鍵的2種方法總結(jié)
一、 準(zhǔn)備工作
首先創(chuàng)建一張表:
create table test( id int primary key, age int )
二、 第一種方法----創(chuàng)建序列達(dá)到自增的效果
1. 創(chuàng)建序列
pgsql里,有種東西叫自增,很像mysql里的約束。建立一個(gè)自增的序列,每次需要獲取自增主鍵時(shí),調(diào)用一下這個(gè)序列就可以了。建立自增主鍵的序列的語(yǔ)法:
CREATE SEQUENCE test_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 CACHE 1;
- INCREMENT BY : 每次序列增加(或減少)的步長(zhǎng)
- MINVALUE : 序列最小值,NO MINVALUE表示沒(méi)有最小值
- MAXVALUE : 序列最大值,NO MAXVALUE表示沒(méi)有最大值
- START WITH :以什么序列值開始
- CYCLE : 序列是否循環(huán)使用
- OWNED BY : 可以直接指定一個(gè)表的字段,也可以不指定。
需要自增主鍵的時(shí)候,調(diào)用nextval(序列名)就可以了:
test=# select nextval('test_id_seq');
nextval
---------
12. 序列的相關(guān)方法
相關(guān)的方法如下(regclass 表示序列的名稱):
| 函數(shù) | 返回類型 | 描述 |
|---|---|---|
| currval( regclass ) | bigint | 獲取指定序列最近一次使用netxval后的數(shù)值,如果沒(méi)有使用nextval而直接使用currval會(huì)出錯(cuò) |
| lastval() | bigint | 返回最近一次用 nextval 獲取的任意序列的數(shù)值 |
| nextval( regclass ) | bigint | 遞增序列并返回新值 |
| setval( regclass,bigint ) | bigint | 設(shè)置序列的當(dāng)前數(shù)值 |
| setval( regclass,bigint ,boolean ) | bigint | 設(shè)置序列的當(dāng)前數(shù)值以及 is_called 標(biāo)志,如果為true則立即生效,如果為false,則調(diào)用一次nextval后才會(huì)生效 |
需要什么值就去找具體的函數(shù)就行了。
3. 插入數(shù)據(jù)
假設(shè)現(xiàn)在要向test表中插入數(shù)據(jù),id自增,則:
insert into test values(
nextval('test_id_seq') , 1
)但是這種操作,每次都得寫一遍序列名,很煩。不過(guò)有辦法解決??聪旅妫?/p>
4. 設(shè)置默認(rèn)值
可以設(shè)置id字段的默認(rèn)值為nextval(‘test_id_seq’),這樣插入數(shù)據(jù)就不用每次都寫一遍了。
alter table test -- 表名 alter column id -- 列名 set default nextval( 'test_id_seq' -- 序列名 );
再向test表中插入數(shù)據(jù),這樣寫就行了:
insert into test(age) values(12)
或者直接:
insert into test values(12)
三、第二種方法----使用SERIAL
1. 建表語(yǔ)句
使用serial時(shí),建表語(yǔ)句需要改一下:
create table test( id serial primary key, age int )
這時(shí)候,會(huì)自動(dòng)創(chuàng)建名為表名_字段名_seq的序列,且MAXVALUE=9223372036854775807,其余值為1。
例如,建立上表以后,則自動(dòng)創(chuàng)建出名為test_id_seq的序列。
2. 插入數(shù)據(jù)
插入數(shù)據(jù),這樣寫就行了:
insert into test(age) values(12)
或者直接:
insert into test values(12)
3. 如何獲取序列的當(dāng)前值
使用如下sql可以獲取序列當(dāng)前值:
select currval('test_id_seq')總結(jié)
到此這篇關(guān)于PostgreSQL建立自增主鍵的2種方法的文章就介紹到這了,更多相關(guān)PostgreSQL建立自增主鍵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL使用SQL實(shí)現(xiàn)俄羅斯方塊的示例
基于PostgreSQL實(shí)現(xiàn)的俄羅斯方塊游戲項(xiàng)目Tetris-SQL,通過(guò)純SQL代碼和數(shù)據(jù)庫(kù)操作重構(gòu)了經(jīng)典游戲邏輯,展現(xiàn)了SQL語(yǔ)言的圖靈完備性和技術(shù)潛力,本文介紹PostgreSQL使用SQL實(shí)現(xiàn)俄羅斯方塊的示例,感興趣的朋友一起看看吧2022-04-04
postgreSQL數(shù)據(jù)庫(kù) 實(shí)現(xiàn)向表中快速插入1000000條數(shù)據(jù)
這篇文章主要介紹了postgreSQL數(shù)據(jù)庫(kù) 實(shí)現(xiàn)向表中快速插入1000000條數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
SQL Server數(shù)據(jù)遷移至PostgreSQL出錯(cuò)的解釋以及解決方案
最近對(duì)SQL Server到PostgreSQL的數(shù)據(jù)遷移時(shí)出現(xiàn)了問(wèn)題,返回的錯(cuò)誤為:invalid byte sequence for encoding "UTF8": 0x00。經(jīng)查證pg源代碼,該問(wèn)題引起的原因是sql server的字符類型字段中含有空字符\0,該字符在pg中不支持。2014-09-09
Cenots7 離線安裝部署PostgreSQL 的詳細(xì)過(guò)程
這篇文章主要介紹了Cenots7 離線安裝部署PostgreSQL 的詳細(xì)過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件詳解
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Postgresql - 查看鎖表信息的實(shí)現(xiàn)
這篇文章主要介紹了Postgresql 查看鎖表信息的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
實(shí)操解決Navicat連接postgresql時(shí)出現(xiàn)‘datlastsysoid does not&
這篇文章主要介紹了實(shí)操解決Navicat連接postgresql時(shí)出現(xiàn)‘datlastsysoid does not exist‘報(bào)錯(cuò)的問(wèn)題,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12
PostgreSQL 分區(qū)表的 ALTER TABLE 語(yǔ)句執(zhí)行機(jī)制解析
這篇文章主要介紹了PostgreSQL 分區(qū)表的 ALTER TABLE 語(yǔ)句執(zhí)行機(jī)制解析的相關(guān)資料,需要的朋友可以參考下2026-02-02
postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作
這篇文章主要介紹了postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02

