首页 > 技术文章 > postgresql发放流水号

zp900704 2018-01-05 13:21 原文

在软件开发过程中会遇到流水号发放的问题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语句我们可以得到不同的序列号了,根据实际情况修改自己的代码吧。
 




推荐阅读