PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器。所以,Sequence也可以通过在每个属性后加上 autoincrment的值的形式存在。
sequence的作用有两个方面:
- 作为表的唯一标识符字段的默认值使用
- 主要用于记录数据库中的id,只要语句有动作(I|U|D),sequence的号就会随着更新。
Sequence 对象中包含当前值,和一些独特属性,例如如何递增(或者递减)。实际上,Sequence 是不能被直接访问到的;他们需要通过 PostgreSQL 中的相关函数来操作他们。
创建序列
创建的语法如下:
CREATE SEQUENCE sequencename
[ INCREMENT increment ] -- 自增数,默认是 1
[ MINVALUE minvalue ] -- 最小值
[ MAXVALUE maxvalue ] -- 最大值
[ START start ] -- 设置起始值
[ CACHE cache ] -- 是否预先缓存
[ CYCLE ] -- 是否到达最大值的时候,重新返回到最小值
Sequence 使用的是整型数值,因此它的取值范围是 [-2147483647, 2147483647] 之间;现在我们创建一个简单的序列:
CREATE SEQUENCE comment_id_seq INCREMENT 1;
使用序列
我们需要知道的 Sequence 的函数使用:
- nextval(‘sequence_name’): 将当前值设置成递增后的值,并返回
- currval(‘sequence_name’): 返回当前值
- setval(‘sequence_name’, n, b=true): 设置当前值;b 默认设置 true,下一次调用 nextval() 时,直接返回 n,如果设置 false,则返回 n+increment:
删除序列
DROP SEQUENCE seq_name[, ...]
来删除一个或者多个序列。命令中的 seq_name 是序列名,不须被引号包围;如果是多个序列,可以使用逗号隔开。
pigdb=# DROP SEQUENCE shipments_ship_id_seq;
ERROR: cannot drop sequence shipments_ship_id_seq because other objects depend on it
DETAIL: default for table shipments column id depends on sequence shipments_ship_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.
这里报错了,如果该序列被其他对象所引用,因此无法直接删除,除非使用DROP…CASCADE
我们可以使用下面的语句来查看的序列是否被数据库中的其他对象引用:
pigdb=# SELECT p.relname, a.adsrc FROM pg_class p
JOIN pg_attrdef a on (p.relfilenode = a.adrelid)
WHERE a.adsrc ~ 'shipments_ship_id_seq';
relname | adsrc
-----------+--------------------------------------------
shipments | nextval('shipments_ship_id_seq'::regclass)
(1 row)
这里检查到 shipments_ship_id_seq 序列被 shipments 引用。你可以把这个序列名替换成任何一个你像查看的序列;或者不添加任何条件查看当前数据库中所有序列的引用。
(此处没有理解,后续补充)
思路参考学习了这个大神的博客:
PostgreSQL - 序列