引言
在持久层框架如Hibernate(JPA)、Mybatis中经常会用到Sequences(函数)去创建主键值,
PostgreSQL中,用serial数据类型的主键,数据库会自动创建Sequences,
那么我们自己设置的integer主键,如何设置添加Sequences呢?
目录
一.测试环境:
1. pgadmin4 <点我查看如何安装>
(没有pgadmin4,请用命令行+SQL代替)
2. psql (PostgreSQL) 9.6.5
3. 结构图:
二.创建表:
1.表名 mytable
2.主键名 myid
3.模式名 gys
4.用户名 postgres
测试数据库中,创建表:(gys 是模式名,类似namespace,默认是public)
SQL:
CREATE TABLE gys.mytable
(
myid integer NOT NULL,
PRIMARY KEY (myid)
)
WITH (
OIDS = FALSE
);
ALTER TABLE gys.mytable
OWNER to postgres;
三.创建Sequences:
1. Sequences 名称 mytable_myid_seq
2.主键名 myid
3.模式名 gys
图形pgadmin管理:
在pgadmin中,我们可以在sequences上右键,create -> sequences
如图:
Step 1.
Step 2.
Step 3.
详细参数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创建:
语法:
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;
四.为主键设置Sequences:
执行SQL:
alter table gys.mytable alter column myid set default nextval('gys.mytable_myid_seq');
五.测试Sequences函数:
所有序列函数参见”附录:序列函数”
SELECT nextval('gys.mytable_myid_seq');
INSERT INTO gys.mytable VALUES (nextval('gys.mytable_myid_seq'));
SELECT myid FROM gys.mytable;
参考资料:
https://www.postgresql.org/docs/8.1/static/sql-createsequence.html
https://www.postgresql.org/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
附录:序列函数
函数 | 返回类型 | 描述 |
---|---|---|
nextval(regclass) | bigint | 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。 |
currval(regclass) | bigint | 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。 |
lastval() | bigint | 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 |
setval(regclass, bigint) | bigint | 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。 |
setval(regclass, bigint, boolean) | bigint | 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为true或false。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。 |