两天前我发布了this问题,我认为我没有正确解释这个问题,所以我会尝试在这里更好地解释它。
假设我想创建一个服务,当收到请求时返回一个唯一的编号。
这个号码应该:
1
1
1
1
现在我需要在 ASP.NET Core Web API、Entity Framework Core 和 Postgres 作为数据库中构建该服务。
有一个示例Python代码可以实现我所需要的:
class Numbering:
def __init__(self):
self.number = 0
def get_number(self):
self.number += 1
return self.number
def reset(self):
self.number = 0
num = Numbering()
for i in range(10):
print(num.get_number())
num.reset()
print("number has been reset")
for i in range(10):
print(num.get_number())
现在我想创建相同的东西,但是大规模地有多个用户请求此服务,不会为两个唯一的请求提供相同的数字。
例如:
create sequence recycle_seq maxvalue 10 cycle;
create table inv_tbl(inv_no integer generated always as identity PRIMARY KEY, seq_id integer DEFAULT nextval('recycle_seq'));
insert into inv_tbl values (default, default), (default, default), (default, default), (default, default), (default, default), (default, default), (default, default), (default, default), (default, default), (default, default), (default, default);
select * from inv_tbl;
inv_no | seq_id
--------+--------
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
6 | 6
7 | 7
8 | 8
9 | 9
10 | 10
11 | 1
上面创建的序列只会前进到 10,然后循环回到 1。显然您会想要一个更大的
maxvalue
。然后将该序列附加到 seq_id
列作为 DEFAULT
值。列 inv_no
使用 generated always as identity
创建一个 DEFAULT
,它将递增到 integer
类型允许的最大值。这意味着当插入 11 行时,inv_no
将继续递增,而 seq_id
将在 10 处滚动回到 1。