分享

PostgreSQL如何为主键创建自增序列(Sequences)

 gideshi 2020-02-20

Morpheus丶 最后发布于2017-10-10 13:12:45 

引言

在持久层框架如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./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

附录:序列函数

函数返回类型描述
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才开始递增该序列。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多