postgresql数据库如何实现主键自增

postgresql数据库可以创建主键,但是没有像mysql那样直接指定主键自增的auto_increment关键字,因此如果在postgresql中创建表指定主键自增使用auto_increment会报错。那么如何实现主键自增,postgresql通过序列来实现。序列可以实现自动增长,而且表字段可以指定默认值,因此可以通过指定默认值的方式来实现主键自增。

首先介绍一下序列

CREATE SEQUENCE创建一个新的序列数 发生器。这涉及到用名称name创建并且初始化 一个新的特殊的单行表。该发生器将由发出该命令的用户所拥有。
如果给出一个模式名称,则该序列将将被创建在指定的模式中。否则它会被 创建在当前模式中。临时序列存在于一个特殊的模式中,因此在创建临时序列 时不能给出模式名。序列名称必须与同一模式中任何其他序列、表、索引、 视图或者外部表的名称不同。

创建序列常用的语法为:
CREATE SEQUENCE name
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

参数含义介绍:
start with 表示这个序列从什么地方开始,这里表示从1开始。
increment by 表示每次的增长幅度,可为正可为负,这里表示每次增长1。
MINVALUE 表示这个序列能产生的最小值,这里表示没有最小值。(注意最小值是有范围的,序列是基于bigint算法的,因此范围是不能超过一个八字节 整数的范围(-9223372036854775808 到 9223372036854775807))
MAXVALUE 表示这个序列能产生的最大值,这里表示没有最大值。(同上最大值也是有范围的)
CACHE 指定要预分配多少 个序列数并且把它们放在内存中以便快速访问。最小值为 1 (一次只生成 一个值,即没有缓存),默认值也是 1

序列函数介绍

**nextval(regclass)😗*递增序列对象到它的下一个值并且返回该值。这个动作是自动完成的: 即使多个会话并发执行nextval,每个进程也会安全地收到一个唯一的序列值。
**currval(regclass)😗*在当前会话中返回最近一次nextval取到的该序列的值(如果在本会话中从未在该序列上调用过nextval,那么会报告一个错误)。
**lastval()😗*返回当前会话里最近一次nextval返回的值。 这个函数等效于currval, 只是它不用序列名作参数, 它指的是哪个序列nextval被应用到当前会话。 如果当前会话还没有调用过nextval, 那么调用lastval会报错。
**setval(regclass, bigint):**重置序列对象的计数器值。

为表的主键设置自增

创建自增序列

CREATE SEQUENCE lkz_test_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

创建表,并且为表的主键指定默认值

create table t_test(
id int default nextval(‘lkz_test_seq’) PRIMARY key ,
name varchar(300)
);

或者先创建表,再为表的主键字段指定约束
alter table t_test alter column id set default nextval(‘lkz_test_seq’);

插入数据

insert into t_test(name) values (‘lkz’);
发现已经向表中插入了一条id为1,name为lkz的数据。