sql >> データベース >  >> RDS >> Oracle

Oracle:max(id)+1とsequence.nextvalの違い

    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値で作成されていること、および挿入を行うすべてのものがシーケンスを使用していることを確認する必要があります。将来のみ。



    1. oracle SQLに加えて、SQLファイルでコマンドを終了する方法は?

    2. postgresqlはギャップのないシーケンスを生成します

    3. SQLAlchemy ON DUPLICATE KEY UPDATE

    4. SQLServerテーブルにデフォルト値の列を挿入するためのSQLDEFAULT制約