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

引言

在持久层框架如Hibernate(JPA)、Mybatis中经常会用到Sequences(函数)去创建主键值,
PostgreSQL中,用serial数据类型的主键,数据库会自动创建Sequences,
那么我们自己设置的integer主键,如何设置添加Sequences呢?

目录

  • 引言
  • 目录
  • 一测试环境
      • pgadmin4 点我查看如何安装
      • psql PostgreSQL 965
      • 结构图
  • 二创建表
      • 表名 mytable
      • 主键名 myid
      • 模式名 gys
      • 用户名 postgres
      • SQL
  • 三创建Sequences
      • Sequences 名称 mytable_myid_seq
      • 主键名 myid
      • 模式名 gys
    • 图形pgadmin管理
    • SQL创建
      • SQL
  • 四为主键设置Sequences
  • 五测试Sequences函数
  • 参考资料
  • 附录序列函数

一.测试环境:

1. pgadmin4 <点我查看如何安装>

(没有pgadmin4,请用命令行+SQL代替)

2. psql (PostgreSQL) 9.6.5

3. 结构图:

PostgreSQL如何为主键创建自增序列(Sequences)_第1张图片

二.创建表:

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.
PostgreSQL如何为主键创建自增序列(Sequences)_第2张图片

Step 3.

PostgreSQL如何为主键创建自增序列(Sequences)_第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;

PostgreSQL如何为主键创建自增序列(Sequences)_第4张图片

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');

PostgreSQL如何为主键创建自增序列(Sequences)_第5张图片

INSERT INTO gys.mytable VALUES (nextval('gys.mytable_myid_seq'));
SELECT myid FROM gys.mytable;

PostgreSQL如何为主键创建自增序列(Sequences)_第6张图片

参考资料:

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才开始递增该序列。

  1. 参数见:https://www.postgresql.org/docs/8.1/static/sql-createsequence.html ↩

你可能感兴趣的:(MyBatis,PostgreSQL)