ホームページ >データベース >mysql チュートリアル >SQLite は事前の SELECT ステートメントなしで UPSERT 操作を実行できますか?

SQLite は事前の SELECT ステートメントなしで UPSERT 操作を実行できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-22 03:42:08195ブラウズ

Can SQLite Perform UPSERT Operations Without a Preliminary SELECT Statement?

SQLite の UPSERT 操作: 事前の SELECT ステートメントは不要

質問:

Wikipedia の UPSERT の定義によれば、INSERT 操作と UPDATE 操作を組み合わせたものです。目標は、レコードが存在するかどうかに基づいて、既存のレコードを更新するか、新しいレコードを挿入する単一の操作を実装することです。

質問:

更新または挿入が必要かどうかを判断するために最初に SELECT を実行せずに、SQLite で UPSERT を実行することは可能ですか?

答え:

SQLite での UPSERT サポート

SQLite バージョン 3.24.0 では、ON CONFLICT 句を使用した UPSERT のサポートが導入されました。

文法:

<code class="language-sql">INSERT OR REPLACE INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...)
ON CONFLICT (约束名) DO UPDATE SET 列1 = 值1, 列2 = 值2, ...</code>

例:

列 ID、名前、役割を持つテーブルを考えてみましょう。 ID が存在する場合は名前とロールを更新し、存在しない場合はロールのデフォルト値を持つレコードを挿入する UPSERT ステートメントを作成しましょう。

<code class="language-sql">INSERT OR REPLACE INTO Employee (id, name, role)
VALUES (1, 'John Doe', 'CEO')
ON CONFLICT (id) DO UPDATE SET name = 'John Doe', role = 'CEO';</code>

代替:

SQLite が UPSERT をサポートする前は、同様の機能を実現する面倒な方法がいくつかありました。

  • 部分挿入: 更新する列のみを挿入し、他の列はデフォルトのままにします。ただし、これはデフォルト値が許容される場合にのみ機能します。
  • 条件付き INSERT: SELECT ステートメントを使用してレコードが存在するかどうかを確認し、対応する INSERT または UPDATE ステートメントを実行します。このアプローチでは複数のデータベース アクセスが必要となるため、オーバーヘッドが増加する可能性があります。

SELECT との比較:

UPSERT は、挿入操作または更新操作を 1 つのクエリで実行するため、通常、最初の SELECT よりも効率的です。ただし、テーブルが非常に大きい場合は、場合によっては SELECT の方が高速な場合があります。

以上がSQLite は事前の SELECT ステートメントなしで UPSERT 操作を実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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