PostgreSQL の主キー シーケンスの競合を解決する
重複キー エラーによるデータ挿入の失敗は、主キー シーケンスがテーブルの行と同期していないことを示していることがよくあります。これは通常、データベースのインポートまたは復元プロセスの後に発生します。 これを修正する方法は次のとおりです:
シーケンスの不均衡の確認:
まず、既存の最も高い ID を決定します。
<code class="language-sql">SELECT MAX(id) FROM your_table;</code>
次のシーケンス番号を調べます:
次に、シーケンスの次の値を確認します:
<code class="language-sql">SELECT nextval('your_table_id_seq');</code>
シーケンス値がテーブルの最大 ID より小さい場合、同期が必要です。
トランザクションの開始:
データの整合性を確保するために、修正をトランザクション内にラップします:
<code class="language-sql">BEGIN;</code>
専用テーブルロック:
同時変更を防ぐには、テーブルを排他的にロックします:
<code class="language-sql">LOCK TABLE your_table IN EXCLUSIVE MODE;</code>
シーケンス値の調整:
次のコマンドを使用してシーケンスを更新します:
<code class="language-sql">SELECT setval('your_table_id_seq', GREATEST((SELECT MAX(your_id) FROM your_table), (SELECT nextval('your_table_id_seq') - 1)));</code>
これにより、テーブルの最大 ID または現在のシーケンス値から 1 を引いた値の大きい方にシーケンスが設定されます。
トランザクションのコミット:
変更を完了します:
<code class="language-sql">COMMIT;</code>
テーブルのロックを解除します:
テーブルのロックは、トランザクションのコミット後に自動的に解放されます。
これらの手順に従うと、主キー シーケンスがテーブル データと一致することが保証され、今後の挿入時の重複キー エラーが排除されます。
以上がテーブル行と同期していない PostgreSQL 主キー シーケンスを再同期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。