postgresqlシーケンスに関して質問があります。
たとえば、bigserialデータ型の場合、シーケンスが進められてから番号が取得され、挿入/コミットが成功しなくても、シーケンスはバックトラックされません。つまり、次にテーブルに挿入するときに、シーケンス番号にギャップがある可能性があります。
テーブルに挿入前の行トリガーがあり、psycopg2を使用しています。
前もって感謝します。
postgresqlシーケンスに関して質問があります。
たとえば、bigserialデータ型の場合、シーケンスが進められてから番号が取得され、挿入/コミットが成功しなくても、シーケンスはバックトラックされません。つまり、次にテーブルに挿入するときに、シーケンス番号にギャップがある可能性があります。
テーブルに挿入前の行トリガーがあり、psycopg2を使用しています。
前もって感謝します。
挿入/コミットが成功しなくても、シーケンスはバックトラックしません。つまり、次にテーブルに挿入するときに、シーケンス番号にギャップがある可能性があります。
はい、それは本当です、そしてそれは大丈夫です。通常、シーケンスが一意であり(通常はPKの場合)、ギャップがまったく問題にならないテーブル内の値を取得する必要があります。
興味がある場合:並行性について考えると、これは自然な動作です。トランザクションT1が行を挿入し、シーケンスからPK1を取得し、その値を使用して他のテーブルに別のレコードを作成するとします...その間に(T1がコミットする前に)別のトランザクションT2が同じテーブルに行を挿入します。次に、T1ロールバックとT2コミット...
ところで:「ギャップのない」シーケンスが必要な場合...最初にそれが本当に必要かどうかを自問してください(通常は実際には必要ありません-そしてそれを頻繁に要求することは設計の概念的な問題を指します)...しかし本当に必要です、あなたはこれを読むことができます。
バックトラックは、完了するまでロックする必要があります。これは悪いことです。特に、10個のテーブルがすべて同じシーケンスを利用できる場合はそうです。順序が必要な場合は、シーケンスを使用せずに、row_number()などのウィンドウ関数を使用してください。