ホームページ > データベース > mysql チュートリアル > テーブル行と同期していない PostgreSQL 主キー シーケンスを再同期するにはどうすればよいですか?

テーブル行と同期していない PostgreSQL 主キー シーケンスを再同期するにはどうすればよいですか?

DDD
リリース: 2025-01-23 12:09:11
オリジナル
435 人が閲覧しました

How Do I Resynchronize a PostgreSQL Primary Key Sequence Out of Sync with Table Rows?

PostgreSQL の主キー シーケンスの競合を解決する

重複キー エラーによるデータ挿入の失敗は、主キー シーケンスがテーブルの行と同期していないことを示していることがよくあります。これは通常、データベースのインポートまたは復元プロセスの後に発生します。 これを修正する方法は次のとおりです:

  1. シーケンスの不均衡の確認:

    まず、既存の最も高い ID を決定します。

    <code class="language-sql">SELECT MAX(id) FROM your_table;</code>
    ログイン後にコピー
  2. 次のシーケンス番号を調べます:

    次に、シーケンスの次の値を確認します:

    <code class="language-sql">SELECT nextval('your_table_id_seq');</code>
    ログイン後にコピー

    シーケンス値がテーブルの最大 ID より小さい場合、同期が必要です。

  3. トランザクションの開始:

    データの整合性を確保するために、修正をトランザクション内にラップします:

    <code class="language-sql">BEGIN;</code>
    ログイン後にコピー
  4. 専用テーブルロック:

    同時変更を防ぐには、テーブルを排他的にロックします:

    <code class="language-sql">LOCK TABLE your_table IN EXCLUSIVE MODE;</code>
    ログイン後にコピー
  5. シーケンス値の調整:

    次のコマンドを使用してシーケンスを更新します:

    <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 を引いた値の大きい方にシーケンスが設定されます。

  6. トランザクションのコミット:

    変更を完了します:

    <code class="language-sql">COMMIT;</code>
    ログイン後にコピー
  7. テーブルのロックを解除します:

    テーブルのロックは、トランザクションのコミット後に自動的に解放されます。

これらの手順に従うと、主キー シーケンスがテーブル データと一致することが保証され、今後の挿入時の重複キー エラーが排除されます。

以上がテーブル行と同期していない PostgreSQL 主キー シーケンスを再同期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート