問題タブ [upsert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - SQL Server に Update ストアド プロシージャを挿入する
レコードが存在する場合は更新を行い、そうでない場合は挿入を行うストアド プロシージャを作成しました。次のようになります。
このように書くことの背後にある私のロジックは、更新が where 句を使用して暗黙的な選択を実行し、それが 0 を返す場合、挿入が行われるということです。
この方法に代わる方法は、選択を行い、返された行数に基づいて更新または挿入を行うことです。更新を行う場合、2 つの選択 (最初の明示的な選択呼び出しと、更新の場所での 2 番目の暗黙的な呼び出し) が発生するため、これは非効率的であると考えました。プロシージャが挿入を行う場合、効率に違いはありません。
ここで私の論理は正しいですか?これは、挿入と更新をストアド プロシージャに結合する方法ですか?
sql - SQL Server での INSERT OR UPDATE のソリューション
のテーブル構造を仮定しますMyTable(KEY, datafield1, datafield2...)
。
多くの場合、既存のレコードを更新するか、存在しない場合は新しいレコードを挿入します。
基本的に:
これを書くための最良のパフォーマンスの方法は何ですか?
sql - Oracle: UPSERT の方法 (テーブルへの更新または挿入?)
UPSERT 操作は、データに一致する行がテーブルに既に存在するかどうかに応じて、テーブル内の行を更新または挿入します。
Oracle には特定の UPSERT ステートメントがないため、これを行う最善の方法は何ですか?
nhibernate - NHibernate を使用してレコードを挿入または更新 (または上書き) するにはどうすればよいですか?
すでに存在するかどうかに関係なく、データベースに行を書き込む必要があります。NHibernate を使用する前は、これはストアド プロシージャで行われていました。プロシージャは更新を試行し、行が変更されていない場合は挿入にフォールバックします。アプリケーションはレコードが存在するかどうかを気にしないため、これはうまく機能しました。
私が見つけた NHibernate のソリューションでは、エンティティをロードして変更するか、エンティティを削除して新しいエンティティを挿入できるようにする必要があります。アプリケーションは、レコードが既に存在するかどうかを気にする必要があります。それを回避する方法はありますか?
IDは重要ですか?
割り当てられた ID
オブジェクトには割り当てられた ID としてキーワードがあり、テーブルの主キーです。
SaveOrUpdate() は Id に基づいて Save() または Update() メソッドを適切に呼び出すことを理解しています。割り当てられた ID を使用すると、ID が保存されていない値ではないため、これは機能しません。ただし、代わりに Version または Timestamp フィールドをインジケータとして使用できます。実際には、メモリ内のオブジェクトがデータベース内のレコードに関連付けられているかどうかのみが反映されるため、これは関係ありません。レコードがデータベースに存在するかどうかは示しません。
生成された ID
割り当てられた ID が本当に問題の原因である場合は、キーワードの代わりに生成された ID を主キーとして使用できます。これにより、事実上常に挿入されるため、NHibernate の挿入/更新の問題が回避されます。ただし、キーワードの重複を防ぐ必要があります。キーワード列に一意のインデックスを使用すると、主キーが異なっていても、重複するキーワードに対して例外がスローされます。
別のアプローチ?
おそらく問題は実際には NHibernate にあるのではなく、これがモデル化されている方法にあります。アプリケーションの他の領域とは異なり、これはオブジェクト中心ではなくデータ中心です。NHibernate によって読み書きが簡単になり、ストアド プロシージャが不要になるのは素晴らしいことです。しかし、既存の値に関係なく単純に記述したいという欲求は、オブジェクトのアイデンティティ モデルのモデルにうまく適合しません。これにアプローチするより良い方法はありますか?
sql - DB2 には「挿入または更新」ステートメントがありますか?
私のコード (Java) から、コードの実行後にデータベース (DB2) に行が存在することを確認したいと考えています。
私のコードは現在、を実行し、select
結果が返されない場合は を実行しinsert
ます。マルチスレッド環境で実行すると同時実行性の問題が発生するため、このコードはあまり好きではありません。
私がやりたいことは、このロジックを Java コードではなく DB2 に入れることです。DB2 にはinsert-or-update
ステートメントがありますか? または、私が使用できるようなものはありますか?
例えば:
それを行う別の方法は、おそらく常に挿入を実行して「SQLコード-803主キーが既に存在します」をキャッチすることですが、可能であればそれを避けたいと思います。
sql - SQL(Firebird/MySql)でレコードを更新/挿入する正しい/最速の方法は何ですか
データベース内のレコードが存在する場合は更新し、存在しない場合は挿入する SQL が必要です。これにはいくつかの解決策があるように見えますが、これを行うための正しい/受け入れられた方法が何であるかわかりません。
更新は両方のデータベースに対して実行する必要があるため、理想的には Firebird 2 と MySQL 5 の両方で動作することを望みます。プラスになるより多くのデータベースで動作する場合、同じ SQL が両方で実行された場合はより簡単になります。 .
速度と信頼性も考慮されます。この場合、速度よりも信頼性が優先されますが、数千のレコードを (異なるテーブルで) すばやく連続して更新するために使用される可能性があります。
任意の服従?
sql - SQLite - UPSERT *NOT* INSERT または REPLACE
http://en.wikipedia.org/wiki/Upsert
SQL Server に Update ストアド プロシージャを挿入する
私が考えていなかったSQLiteでこれを行う賢い方法はありますか?
基本的に、レコードが存在する場合は 4 つの列のうち 3 つを更新します。存在しない場合は、4 番目の列のデフォルト (NUL) 値でレコードを挿入します。
ID は主キーであるため、UPSERT の対象となるレコードは 1 つだけです。
(明らかにUPDATEまたはINSERTが必要かどうかを判断するために、SELECTのオーバーヘッドを回避しようとしています)
提案?
TABLE CREATE の SQLite サイトで Syntax を確認できませんでした。テスト用のデモを作成していませんが、サポートされていないようです。
もしそうなら、私は3つの列を持っているので、実際には次のようになります:
ただし、最初の 2 つの BLOB は競合を引き起こさず、ID のみが競合するため、Blob1 と Blob2 は (必要に応じて) 置き換えられないと仮定します。
データをバインドする場合の SQLite での UPDATE は完全なトランザクションです。つまり、送信された各行を更新するには、次のステートメントが必要です。
ステートメント オブジェクトの寿命は次のようになります。
- sqlite3_prepare_v2() を使用してオブジェクトを作成します
- sqlite3_bind_ インターフェイスを使用して値をホスト パラメータにバインドします。
- sqlite3_step() を呼び出して SQL を実行します。
- sqlite3_reset() を使用してステートメントをリセットし、ステップ 2 に戻って繰り返します。
- sqlite3_finalize() を使用してステートメント オブジェクトを破棄します。
UPDATE は INSERT に比べて遅いと思いますが、主キーを使用した SELECT と比べてどうですか?
おそらく、select を使用して 4 番目の列 (Blob3) を読み取り、次に REPLACE を使用して、元の 4 番目の列と最初の 3 列の新しいデータをブレンドする新しいレコードを書き込む必要がありますか?
stored-procedures - マージ ステートメントでプロシージャ パラメーターを使用する方法
マージステートメント(upsert)を使用してテーブルを更新/挿入するプロシージャを作成しています。今、問題があります:プロシージャパラメータを使用して、このアップサートを行う必要があります。
プロシージャ xyz( a in table.a%type,b in table.b%type,....) はいくつかのローカル変数です。source_table を使用して target_table へのマージを開始します。ソース テーブルの代わりに、一致した場合はここでプロシージャ パラメータを使用する必要があります (テーブルの主キーの条件)。一致しない場合はテーブルを更新し、テーブルを挿入します。xyz を終了します。マージステートメントでソーステーブルの代わりにプロシージャパラメーターを使用する方法は?? または、プロシージャ パラメータを取得してソース テーブルの値として使用するためのクエリを提案してください。
お願い助けて。前もって感謝します。
sql - クエリでプロシージャ パラメータを使用する方法
たとえば 、クエリを使用して同じプロシージャ内のプロシージャ パラメーターにアクセスする方法: この手順を参照してください。
上記の手順とマージステートメントでは、パラメーター値をテーブル参照として使用し、それらの値を使用して、指定された条件に基づいてテーブルを更新または挿入するようなクエリが必要です。
お願い助けて。前もって感謝します
mysql - テーブルの行を更新する方法、または行が存在しない場合は挿入する方法を教えてください。
次のカウンターの表があります。
カウンターの1つをインクリメントするか、対応する行がまだ存在しない場合はゼロに設定したいと思います。標準SQLで並行性の問題なしにこれを行う方法はありますか?操作はトランザクションの一部である場合もあれば、別個の場合もあります。
SQLは、可能であれば、SQLite、PostgreSQL、およびMySQLで変更せずに実行する必要があります。
検索により、並行性の問題に悩まされているか、データベースに固有のいくつかのアイデアが得られました。
INSERT
新しい行を試してUPDATE
、エラーが発生した場合。残念ながら、のエラーINSERT
は現在のトランザクションを中止します。UPDATE
行、および行が変更されていない場合はINSERT
、新しい行。MySQLには
ON DUPLICATE KEY UPDATE
句があります。
編集:すべての素晴らしい返信をありがとう。ポールは正しいように見えますが、これを行うための単一のポータブルな方法はありません。非常に基本的な操作のように聞こえるので、それは私にとって非常に驚くべきことです。