大家都知道pgsql和mysql不同,mysql字段有有自增属性,pgsql并没有,但是pgsql和oracle一样有序列,很多人刚接触pgsql的时候,并不知道序列是什么,怎么用,下面这篇文章就介绍序列,并且怎么使用序列。
介绍
在 pg数据库中,序列是数据库的一种对象,就好比视图,触发器一样,是用于生成唯一标识符(如自增主键)的对象,我们在pgsql中就可以用序列来实现逐渐自增长。
在navicat中,序列在菜单栏其他的位置打开
基本操作
创建序列
,这里创建一个序列名为seq_student_message,我们创建学生信息表的序列
CREATE SEQUENCE seq_student_message
START WITH 1 – 序列从1开始
INCREMENT BY 1 – 序列执行1次自增1
MINVALUE 1 – 序列最小值是1
MAXVALUE 1000; – 序列最大值是1000
获取序列值
,执行我们刚才创建的序列
SELECT NEXTVAL(‘seq_student_message’);
手动设置序列的值
SELECT SETVAL(‘seq_student_message’, 100);
mybatis写法,为了避免主键和业务的强链接,会用序列来当作表的物理主键来使用,一般会这么写
<selectKey keyProperty="studentMessageId" resultType="java.lang.Long" order="BEFORE">
SELECT NEXTVAL('SEQ_STUDENT_MESSAGE')
</selectKey>
在执行新增方法时,会先获取序列的下一个值,然后将获取到的值传给我们表的物理id当作值来使用,这样就实现了主键自增,而且序列是单独于数据库表的,可以单独操作序列值,非常方便
在实际工作中,可能会还有遇到序列冲突的问题,比如,我手动加了一条数据在表中,序列我随便写的1234,在实际业务中做新增操作,正好序列自增到1233,在获取下一个序列是应该是1234,但是1234已存在,这时候pg就会报错,序列值已存在
这时候我们只需要设置序列值为
当前最大值加一
即可。就不会冲突了
SELECT SETVAL(‘seq_student_message’, max_value + 1);
最后就是如何
删除序列
DROP SEQUENCE IF EXISTS ‘seq_student_message’;
删除操作谨慎使用