select max(id) + 1
を使用する アプローチでは、同時に挿入する2つのセッションは、テーブルから同じ現在の最大IDを確認し、両方とも同じ新しいID値を挿入します。これを安全に使用する唯一の方法は、トランザクションを開始する前にテーブルをロックすることです。これは面倒で、トランザクションをシリアル化します。 (そして、Stijnが指摘しているように、最高のレコードが削除された場合、値は再利用できます)。基本的に、このアプローチは絶対に使用しないでください。 (そうするやむを得ない理由がある場合もありますが、これまでに見たことがあるかどうかはわかりません)。
このシーケンスは、2つのセッションが異なる値を取得することを保証し、シリアル化は必要ありません。パフォーマンスが向上し、安全性が高まり、コーディングと保守が容易になります。
シーケンスを使用して重複エラーを取得する唯一の方法は、シーケンス値を超えるIDを持つレコードがテーブルにすでに存在する場合、またはシーケンスを使用せずにレコードを挿入している場合です。したがって、手動で入力されたID(1〜10など)を持つ既存のテーブルがあり、デフォルトの開始値が1のシーケンスを作成した場合、シーケンスを使用した最初の挿入では、すでに存在するID1が挿入されます。 。それを10回試した後、シーケンスは11になり、これは機能します。次に、max-IDアプローチを使用して、12を使用する次の挿入を実行した場合、シーケンスは11のままであり、次にnextval
を呼び出したときにも12になります。 。
シーケンスとテーブルは関連していません。手動で生成されたID値がテーブルに挿入された場合、シーケンスは自動的に更新されないため、2つのアプローチが混在することはありません。 (特に、ドキュメントに記載されているように、同じシーケンスを使用して複数のテーブルのIDを生成できます。)
手動アプローチからシーケンスアプローチに変更する場合は、シーケンスがテーブル内の既存のすべてのIDよりも高いstart-with値で作成されていること、および挿入を行うすべてのものがシーケンスを使用していることを確認する必要があります。将来のみ。