在软件开发过程中会遇到流水号发放的问题postgresql提供了序列号对象
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table.column | NONE } ]
通过使用nextval函数获取下一个序列
example:
CREATE SEQUENCE serial START 101;
SELECT nextval('serial');
但是,当需要分配序列号的对象数不确定,或者是很多的时候,使用这种方式就非常的麻烦了。
一般有两种方式去解决:
1.开发一个序列号发放器服务,所有的序列号全部从这个服务进行获取。
2.直接利用数据库提供的功能实现序列号的发放(针对9.5及以上版本)
第一种方案实现方式或方法各种各样,在此不做阐述,下面主要介绍使用postgresql进行序列号的发放操作。
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ ON CONFLICT [ conflict_target ] conflict_action ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
where conflict_target can be one of:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
and conflict_action is one of:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
我们从上面的postgresql的insert语法可以看到,在insert操作时可以进行相应的逻辑判断操作
假设我们有这样一个场景:我们有许多的文件,每个文件都有一个编号,文件会不断更新,文件的版本号会不断向上迭代,怎行获取这么多的文件的不同的版本号?
CREATE TABLE "public"."serilize" (
"Cluser" varchar(50) COLLATE "default",
"Number" int4
)
INSERT INTO serilize("Cluser","Number")VALUES('1',1) ON CONFLICT ("Cluser") WHERE "Cluser"='1' DO UPDATE SET "Number"=serilize."Number"+1 RETURNING *
通过上面的sql语句我们可以得到不同的序列号了,根据实际情况修改自己的代码吧。