引言
在持久層框架如Hibernate(JPA)、Mybatis中經(jīng)常會用到Sequences(函數(shù))去創(chuàng)建主鍵值,
PostgreSQL中,用serial數(shù)據(jù)類型的主鍵,數(shù)據(jù)庫會自動(dòng)創(chuàng)建Sequences,
那么我們自己設(shè)置的integer主鍵,如何設(shè)置添加Sequences呢?
目錄
一.測試環(huán)境:
1. pgadmin4 <點(diǎn)我查看如何安裝>
(沒有pgadmin4,請用命令行+SQL代替)
2. psql (PostgreSQL) 9.6.5
3. 結(jié)構(gòu)圖:
二.創(chuàng)建表:
1.表名 mytable
2.主鍵名 myid
3.模式名 gys
4.用戶名 postgres
測試數(shù)據(jù)庫中,創(chuàng)建表:(gys 是模式名,類似namespace,默認(rèn)是public)
SQL:
CREATE TABLE gys.mytable
(
myid integer NOT NULL,
PRIMARY KEY (myid)
)
WITH (
OIDS = FALSE
);
ALTER TABLE gys.mytable
OWNER to postgres;
三.創(chuàng)建Sequences:
1. Sequences 名稱 mytable_myid_seq
2.主鍵名 myid
3.模式名 gys
圖形pgadmin管理:
在pgadmin中,我們可以在sequences上右鍵,create -> sequences
如圖:
Step 1.
Step 2.
Step 3.
詳細(xì)參數(shù)1
OK了,生成的SQL:
CREATE SEQUENCE gys.mytable_myid_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 99999999
CACHE 1;
ALTER SEQUENCE gys.mytable_myid_seq
OWNER TO postgres;
SQL創(chuàng)建:
語法:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
SQL:
CREATE SEQUENCE gys.mytable_myid_seq
INCREMENT 1
START 1
NO MINVALUE
NO MAXVALUE
CACHE 2;
四.為主鍵設(shè)置Sequences:
執(zhí)行SQL:
alter table gys.mytable alter column myid set default nextval('gys.mytable_myid_seq');
五.測試Sequences函數(shù):
所有序列函數(shù)參見”附錄:序列函數(shù)”
SELECT nextval('gys.mytable_myid_seq');
INSERT INTO gys.mytable VALUES (nextval('gys.mytable_myid_seq'));
SELECT myid FROM gys.mytable;
參考資料:
https://www./docs/8.1/static/sql-createsequence.html
https://www./docs/9.1/static/functions-sequence.html
http://www.cnblogs.com/mchina/archive/2013/04/10/3012493.html
http://francs3.blog.163.com/blog/static/40576727201111715035318/
http://www.cnblogs.com/nirvana7/archive/2011/12/27/2303673.html
附錄:序列函數(shù)
函數(shù) | 返回類型 | 描述 |
---|---|---|
nextval(regclass) | bigint | 遞增序列對象到它的下一個(gè)數(shù)值并且返回該值。這個(gè)動(dòng)作是自動(dòng)完成的。即使多個(gè)會話并發(fā)運(yùn)行nextval,每個(gè)進(jìn)程也會安全地收到一個(gè)唯一的序列值。 |
currval(regclass) | bigint | 在當(dāng)前會話中返回最近一次nextval抓到的該序列的數(shù)值。(如果在本會話中從未在該序列上調(diào)用過 nextval,那么會報(bào)告一個(gè)錯(cuò)誤。)請注意因?yàn)榇撕瘮?shù)返回一個(gè)會話范圍的數(shù)值,而且也能給出一個(gè)可預(yù)計(jì)的結(jié)果,因此可以用于判斷其它會話是否執(zhí)行過nextval。 |
lastval() | bigint | 返回當(dāng)前會話里最近一次nextval返回的數(shù)值。這個(gè)函數(shù)等效于currval,只是它不用序列名為參數(shù),它抓取當(dāng)前會話里面最近一次nextval使用的序列。如果當(dāng)前會話還沒有調(diào)用過nextval,那么調(diào)用lastval將會報(bào)錯(cuò)。 |
setval(regclass, bigint) | bigint | 重置序列對象的計(jì)數(shù)器數(shù)值。設(shè)置序列的last_value字段為指定數(shù)值并且將其is_called字段設(shè)置為true,表示下一次nextval將在返回?cái)?shù)值之前遞增該序列。 |
setval(regclass, bigint, boolean) | bigint | 重置序列對象的計(jì)數(shù)器數(shù)值。功能等同于上面的setval函數(shù),只是is_called可以設(shè)置為true或false。如果將其設(shè)置為false,那么下一次nextval將返回該數(shù)值,隨后的nextval才開始遞增該序列。 |