8

データベース エントリが存在するかどうかを確認し、存在しない場合は挿入するよりも、単に挿入を実行して挿入を失敗させる方が速いと言われたことがあります。

また、ほとんどのデータベースは、書き込みではなく読み取り用に大幅に最適化されているとも言われました。

これは予想される衝突数の問題ですか? (つまり、エントリが既に存在する可能性が低い場合にのみ挿入する方が高速です。) 実行しているデータベースの種類に依存しますか? さらに言えば、挿入エラーを常にエラー ログに追加するメソッドを使用するのは悪い習慣でしょうか?

ありがとう。

4

5 に答える 5

8

インデックス違反が原因で挿入が失敗する場合、レコードが存在することを確認するよりもわずかに遅くなります。(両方とも、インデックスに値が含まれているかどうかを確認する必要があります。) 挿入が成功する場合、2 つのクエリを発行すると、1 つを発行するよりも大幅に遅くなります。

于 2012-01-20T05:02:42.700 に答える
0

INSERT IGNOREキーが既に存在する場合、挿入コマンドは単に無視され、それ以外の場合は新しい行が挿入されるように使用できます。このようにして、重複する値をチェックし、新しい値も挿入する単一のクエリを発行する必要があります。
INSERT IGNORE を使用すると、すべてのエラーが警告に変わるので注意してください。挿入の無視については、この投稿をお読みください

于 2012-01-20T05:11:54.863 に答える
0

ここで INSERT IGNORE INTO .... を使用できると思います。挿入または無視します。IGNORE キーワードを使用すると、INSERT ステートメントの実行中に発生したエラーは代わりに警告として扱われます。たとえば、IGNORE を使用しない場合、テーブル内の既存の UNIQUE インデックスまたは PRIMARY KEY 値を複製する行は、重複キー エラーを引き起こし、ステートメントは中止されます。IGNORE を使用すると、行はまだ挿入されませんが、エラーは発行されません。

于 2012-01-20T05:17:14.417 に答える
0

古い値を削除して新しい値を挿入する場合は、REPLACEを使用できます INSERT の代わりに REPLACE を使用して、古い行を上書きできます。

REPLACE は INSERT とまったく同じように機能しますが、テーブル内の古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。

それ以外の場合は、挿入または無視するため、 INSERT IGNOREを使用します。

テーブル内の既存の UNIQUE インデックスまたは PRIMARY KEY 値を複製する行は、重複キー エラーを引き起こし、ステートメントは中止されます。IGNORE を使用すると、行はまだ挿入されませんが、エラーは発行されません。

于 2012-01-20T05:21:58.190 に答える
0

あなたの意図が新しいレコードの場合は挿入するか、レコードが既に存在する場合はレコードを更新することである場合、UPSERT を実行するのはどうですか?

チェックアウト - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

レコードが存在するかどうかを確認する代わりに、直接更新を試みることができます。一致するレコードがない場合、@@RowCount は 0 になります。これに基づいて、新しいレコードとして挿入できます。[SQL Server 2008 では、これに MERGE の概念を使用できます]

編集:注意してください、これはMS SQL Serverで機能することを知っていますが、MySQLまたはORACLEについては知りません

于 2012-01-20T05:25:21.957 に答える