1. ホーム
  2. データベース
  3. ポストグレスキュー

Postgresqlのシーケンススキップの問題を解決する

2022-01-19 06:35:52

I. シーケンスの作成

CREATE SEQUENCE seq_bm_menuid
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 99999999999999999999
 START 1
 CACHE 5;

上記の文から、現在のシーケンスはキャッシュが5であることがわかります。

第二に、シーケンスジャンプ値問題に遭遇

ウェブアプリケーションがpostgresqlデータベースにアクセスし、nextval('seq_bm_menuid')でシーケンス値を取得し、ビジネステーブルに挿入したところ、ビジネステーブルのシーケンス値に対応するフィールドの値が連続せず、5間隔でジャンプしていることがわかりました。

図に示すように

III. ちょっとした実験をする

シーケンスジャンプの理由を把握するために、次の方法で小さな実験を行う:pgAdminで2つの新しいクエリウィンドウを作成し、それぞれ実行select nextval('seq_bm_menuid'); 文、ステートメントは、最初のクエリウィンドウで実行されると、戻り値シーケンス147です、ステートメントは2番目のクエリウィンドウで実行すると、戻り値はシーケンス152である。案の定、間隔はまだ5シーケンス値ああを生成するために、何が起こっているかを知るために、次を行うに続けています。

我々は、最初のクエリウィンドウに戻り、再び文を実行し、148のシーケンス値を返し、次に2番目のクエリウィンドウに、再び文を実行し、153のシーケンス値を返し、最後にここでシーケンスキャッシュは、セッションの役割であることを考え出した、我々は、実際に2つのセッション、5の各セッションキャッシュのpostgresqlデータベースを新しいクエリウィンドウが作成されます我々はついにシーケンスジャンプの理由が判明したように。

追記 PostGresqlのシーケンス開始値をリセットする

設定されたPostgresqlのシーケンス値を変更するシナリオはあまり一般的ではなく、一般的にはデータベースを不規則に使用する場合に存在する!

時々、データベースのシーケンスエラーの後、Detail: Key (xttblog_id)=(200007) already exists.のエラーメッセージが発生することがあります。これは、200007のシーケンスがすでに占有されていることを意味します。

このエラーを修正する方法は2つあります。

1つは、nextval関数を実行して、既存のキーをスキップすることです。

SELECT nextval('xttblog_id_seq');

また、シーケンスの開始値をリセットして、すでに存在するキーをスキップするケースもあります。

-- Sequence reset to 2020
alter sequence xttblog_id_seq restart with 2020

上記では、シーケンスを2020年にリセットしています。このシーケンスでは、2020年から始まり、2020年未満はスキップされます。

以上、個人的な体験談ですが、参考になれば幸いです。また、Script Houseをもっと応援してください。もし間違いや不十分な点があれば、遠慮なくアドバイスしてください。