[ES三周年]深入了解Postgres主键自增

2023-03-15 14:33:04 浏览数 (1)

简介

用最简单的教程,抓住最重要的点。本章教程将带你认识Postgres的自增的用法,以及自增的原理。

本章节中会使用Navicat工具对Postgre的数据库进行操作,如果你能按照教程操作,这将会帮助你加深印象。

初遇自增

顾名思义,就是自动增加,最终产生的结果会生成一组有序的值,也称作序列值。

实际,我们仅仅需要两步操作即可为一个字段添加自增属性,第一步,声明自增变量,第二步引用自增变量。

声明自增变量

首先,我们使用下面的SQL命令创建一个自增变量,语法如下:

代码语言:javascript复制
--auto 是自定义变量的名称,你可以使用任意名称
CREATE SEQUENCE "public"."auto"
 INCREMENT 1                        --自增的步长(每一次增加多少)
 MINVALUE 1                         --属性的最小值
 MAXVALUE 9223372036854775807       --属性的最大值
 START 1                            --初始的值
 CACHE 1;                           --缓存值的数量,缺省值为1,表示每次只产生1个新的值

引用自增变量

其次,将该函数赋值给字段的默认值,这样我们就完成了自增字段的设置

代码语言:javascript复制
nextval('auto'::regclass)

实例操作

至此为止,自增属性就设置完成了。

深入了解

  • 大家经常提到主键自增,但其实自增和主键并没有关系,非主键也可以自增,自增是一种获取默认值的途径之一。
    • 还有很多种其他的途径,如:随机值,固定值,特定值等
  • 自增变量是数据库中的全局变量,全局唯一,多表共享。
    • 全局唯一意味着每个数据库实例只能创建一个名为N的自增变量,重复创建会报错。
    • 多表共享,即每个表的每个字段都有权限访问这个自增变量,表和自增变量是一种引用关系,表依引用并且赖自增变量。
    • 自增变量不依赖任何表,即使数据库中没有任何表,你依然可以创建,查看,修改或删除自增变量
  • 不同表之间引用同一个自增变量,得到的序列值按照表数据的添加顺序分配序序列值
  • 同一张表不同字段引用同一个自增变量,得到的序列值按照字段顺序从左到右分配序列值
    • 如果一次性插入多条数据,那么就是先从左到右,再从上到下分配序列值
  • 不同的数据库之间自增变量不共享,且互不干扰
  • 当数据库中仍有字段引用自增变量时,该自增变量无法删除
    • 需要将字段默认值设置引用删除,才可以删除自增变量

扩展知识

获取当前自增变量的值

代码语言:javascript复制
SELECT currval('auto')

设置当前自增变量的值

代码语言:javascript复制
SELECT setval('"public"."auto"', 1, false);

更新到下个序列值

代码语言:javascript复制
SELECT nextval('auto');

删除序列值

代码语言:javascript复制
DROP SEQUENCE "public"."auto";

总结

自增自增是个啥,其实只是个变量哈,这个变量跟库混,而且库里只有它。

你要创建别创建俩,两个一起老打架,删除之前要记得,默认值得清空了。

看着命令还挺多,能用上的也就两三个,全会了,更赚.......

0 人点赞