ASP.NET Core Web API、Entity Framework Core、PostgreSQL で一意の番号を持つ連番サービスを作成するにはどうすればよいですか?

概要

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

「メモ」セクションにあります。