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

UNIQUE制約とINSERT前のチェック

    ほとんどの場合、この2つの違いは十分に小さいので、コードを初めて見る人にとって最も理解しやすい実装を選択することで、選択を決定する必要があります。

    ただし、例外処理にはいくつかの小さいがあると思います。 利点:

    • 例外処理は、潜在的な競合状態を回避します。別のプロセスがチェックと挿入の間にレコードを挿入すると、「チェックしてから挿入」メソッドが失敗する場合があります。したがって、「チェックしてから挿入」を実行している場合でも、挿入で例外処理が必要です。とにかくすでに例外処理を実行している場合は、最初のチェックを廃止することをお勧めします。

    • コードがストアドプロシージャではなく、ネットワークを介してデータベースと対話する必要がある場合(つまり、アプリケーションとデータベースが同じボックス上にない場合)、2つの別々のネットワーク呼び出し(1つはチェック用と1つはチェック用)を使用しないようにします。その他の挿入)および例外処理を介してそれを実行すると、単一のネットワーク呼び出しですべてを処理する簡単な方法が提供されます。現在、2番目のネットワーク呼び出しを回避しながら「チェックしてから挿入」メソッドを実行する方法はたくさんありますが、例外をキャッチすることが最も簡単な方法である可能性があります。

    一方、例外処理には一意の制約(実際には一意のインデックス)が必要であり、パフォーマンスのトレードオフが伴います。

    • 非常に大きなテーブルでは、一意の制約を作成するのが遅くなり、そのテーブルへのすべての挿入でパフォーマンスが低下します。本当に大規模なデータベースでは、制約を適用するために使用される一意のインデックスによって消費される余分なディスクスペースの予算も立てる必要があります。
    • 一方、クエリでそのインデックスを利用できる場合は、テーブルからの選択が速くなる可能性があります。

    また、実際に実行したいのが「update else insert」である状況にある場合(つまり、一意の値を持つレコードがすでに存在する場合は、そのレコードを更新する必要があります。それ以外の場合は、新しいレコードを挿入します。レコード)次に、実際に使用したいのは、特定のデータベースのUPSERTメソッド(ある場合)です。 SQL ServerとOracleの場合、これはMERGEステートメントになります。



    1. MySQLエラーを取り除く方法「プリペアドステートメントは再準備する必要があります」

    2. 条件付き一意制約

    3. 2つの日付間のSQL時間差により、hh:mm:ssになります

    4. MySQL DROP UNIQUE CONSTRAINT