ホームページ >データベース >mysql チュートリアル >SQLite で MySQL の ON DUPLICATE KEY UPDATE を効率的にエミュレートする方法は?

SQLite で MySQL の ON DUPLICATE KEY UPDATE を効率的にエミュレートする方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-15 14:09:43482ブラウズ

How to Efficiently Emulate MySQL's ON DUPLICATE KEY UPDATE in SQLite?

SQLite での MySQL の ON DUPLICATE KEY UPDATE のシミュレーション

SQLite には、MySQL の ON DUPLICATE KEY UPDATE 句に直接相当する機能がありません。これにより、事前定義された一意の制約を使用してレコードの効率的な更新と挿入が可能になります。ただし、別の方法でも同様の効果を達成できます。

代替方法

SQLite で更新/挿入をシミュレートするには、使用できる主な方法が 2 つあります。

  1. 選択 (挿入または更新):

    • SELECT クエリを実行して、レコードが存在するかどうかを確認します。
    • レコードが存在する場合は、UPDATE クエリを実行して、ヒット列をインクリメントします。
    • レコードが存在しない場合は、INSERT クエリを実行してレコードを作成します。
  2. UPDATE (UPDATE が失敗した場合は INSERT):

    • UPDATE クエリを実行して、既存のレコードのヒット列を増分してみてください。
    • レコードが存在しないために UPDATE クエリが失敗した場合は、INSERT クエリを実行してレコードを作成します。

おすすめの方法

どちらの方法にも長所と短所がありますが、一般的には 2 番目の方法 (UPDATE (UPDATE が失敗した場合は INSERT) を使用) の方が効率的です。必要なデータベース操作は 1 つだけであり、不必要な SELECT クエリを回避できます。

推奨されるコード スニペット

「ip」列の一意制約を使用して 2 番目のアプローチを実装するための推奨コード スニペットを次に示します。

<code class="language-sql">INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;</code>

別の Stack Overflow ソリューションの次のコード スニペットは、別の動作する upsert 実装を提供します。

<code class="language-sql">INSERT INTO visits (ip, hits)
VALUES ($ip, COALESCE((SELECT hits FROM visits WHERE ip LIKE $ip), 0) + 1);</code>

以上がSQLite で MySQL の ON DUPLICATE KEY UPDATE を効率的にエミュレートする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。