【问题标题】:Number range maintenance in PostgreSQLPostgreSQL 中的数字范围维护
【发布时间】:2018-05-02 15:19:28
【问题描述】:

我需要针对我在系统中注册的每个客户维护一个号码范围。

用例是客户可以在用户注册过程中选择他们的起始编号范围和结束编号范围,并且他们在系统中创建的每个域对象都将使用他们拥有的范围内的自动递增编号创建指定的。即现有数字 + 1

还有一个要求,一旦范围内的数字用完,数字就会开始循环。

他们也可以随时选择更改号码范围。

即这个逻辑似乎非常接近典型的数据库序列,除了客户指定数字范围的事实,即它不是定义的数字范围

我想知道是否可以动态创建序列,或者作为存储过程的一部分,我可以在其中传递客户序列名称和编号范围?

【问题讨论】:

  • 您可以指定起始值和最大值,包括序列的“循环”选项
  • 循环听起来不错。我的问题更多的是动态创建 postgres 序列,可能使用立即执行,然后可能将序列的名称存储在表中
  • 当然,你可以这样做;应该不是问题。

标签: sql postgresql


【解决方案1】:

您当然可以动态创建序列:

so=# do 'begin execute ''create sequence a cycle start with 93 maxvalue 94 minvalue 93''; end;';
DO

so=# select nextval('a'), nextval('a'),nextval('a'),nextval('a'),nextval('a');
 nextval | nextval | nextval | nextval | nextval
---------+---------+---------+---------+---------
      93 |      94 |      93 |      94 |      93

但首先 - 你可以用太多的序列来膨胀字典,接下来如果只有用户自己可以旋转数字,我认为没有任何需要 - 只需使用 update blah set num = least(maxnumber,num + 1) 或类似的东西

【讨论】:

  • 嗯。是的,你让我想了两次。没错,在我的客户列表变大的某个时间点,可能会有很多序列。
猜你喜欢
  • 2016-02-19
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多