私はあなたが望むことをするための安全で効率的な方法を知りません。キーを自分で定義するか、生成されたキーを使用してどちらかの戦略に固執するかを実際に選択する必要があります。
ひどい同時実行性を気にしない場合は、LOCK TABLE thetable
を実行できます。 、作業を行います、setval
挿入したものの次の空き値へのテーブルの識別子シーケンス、およびcommit
ロックを解除します。ただし、それでもnextval
を明示的に呼び出すアプリでは問題が発生します (多くのORMのように)?INSERT
から値を省略してデータベースに値を定義させるのではなく、 列リストまたは明示的にDEFAULT
という名前を付ける 。
それ以外の場合は、コード(またはPL / PgSQLヘルパー関数)に再試行ループで挿入を実行させて、キーをインクリメントし、整合性エラーが発生したときに再試行することができます。この戦略は、トランザクションごとに1つ以上の挿入を行う必要がある場合は機能しません。さらにSERIALIZABLE
分離モードPL/PgSQLでは実行できないと思います。シリアル化の失敗を処理するには、クライアント側の再試行ループを使用する必要があります。
それはひどい考えです。アプリケーション定義のキーを一貫して使用するか、データベース定義のキーを一貫して使用します。 2つを混ぜないでください。