2 日前にこの質問を投稿しましたが、問題を正しく説明できていないと思うので、ここでよりわかりやすく説明しようと思います。
リクエストが届いたときに一意の番号を返すサービスを作成したいとします。
この番号は次のことを行う必要があります。
次に、そのサービスを 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())
同じものを作成したいのですが、複数のユーザーがこのサービスを要求する規模では、2 つの固有の要求に同じ番号が割り当てられません。
例として:
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 が必要になります。このシーケンスは、DEFAULT 値として seq_id 列に付加されます。 inv_no 列は、生成された always を ID として使用して、整数型で許可される最大値まで増分する DEFAULT を作成します。これは、11 行が挿入されると、inv_no が増加し続ける一方で、seq_id が 10 から 1 にロールオーバーされることを意味します。
これにより、メカニズムがデータベース上に保持され、クライアント側でのコーディングの必要性が軽減されます。シーケンスを手動でリセットしたい場合は、次のようにします。
シーケンスを変更する recycle_seq restart
これにより、シーケンスが 1 に戻ります。
シーケンスの使用に関する注意事項については、ここを参照してください。
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://www.postgresql.org/docs/current/sql-createsequence.html
「メモ」セクションにあります。