タグ付けされた質問 「upsert」

アップサート(更新と挿入の組み合わせ)操作の実行に関する問題について。

11
MySQLテーブルに挿入するか、存在する場合は更新します
行をデータベーステーブルに追加したいのですが、同じ一意のキーを持つ行が存在する場合、その行を更新します。 例えば: insert into table (id, name, age) values(1, "A", 19) 一意のキーがidで、データベースにの行があるとしid = 1ます。その場合、その行をこれらの値で更新します。通常、これはエラーになります。 使用insert IGNOREするとエラーは無視されますが、それでも更新されません。

16
挿入、PostgreSQLの重複更新時?
数か月前に、次の構文を使用してMySQLで複数の更新を一度に実行する方法をStack Overflowの回答から学びました。 INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z) ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2); これでPostgreSQLに切り替えましたが、明らかにこれは正しくありません。それはすべての正しいテーブルを参照しているので、使用されているさまざまなキーワードの問題であると思いますが、PostgreSQLのドキュメントのどこでこれがカバーされているのかわかりません。 明確にするために、いくつかのものを挿入し、それらがすでに存在する場合はそれらを更新します。

21
SQL ServerでのINSERT OR UPDATEのソリューション
のテーブル構造を想定しますMyTable(KEY, datafield1, datafield2...)。 多くの場合、既存のレコードを更新するか、存在しない場合は新しいレコードを挿入します。 基本的に: IF (key exists) run update command ELSE run insert command これを書くのに最も良い方法は何ですか?

18
SQLite-INSERTまたはREPLACEではなくUPSERT
http://en.wikipedia.org/wiki/Upsert SQL Serverに更新ストアドプロシージャを挿入する SQLiteでこれを行うために私が考えていなかった賢い方法はありますか? 基本的に、レコードが存在する場合は4つのカラムのうち3つを更新します。レコードが存在しない場合は、4番目のカラムのデフォルト(NUL)値でレコードを挿入します。 IDは主キーであるため、UPSERTへのレコードは1つしかありません。 (明らかに更新または挿入する必要があるかどうかを判断するために、SELECTのオーバーヘッドを回避しようとしています) 提案? SQLiteサイトでTABLE CREATEの構文を確認できません。テスト用のデモは作成していませんが、サポートされていないようです。 もしそうなら、私は3つの列を持っているので、実際には次のようになります: CREATE TABLE table1( id INTEGER PRIMARY KEY ON CONFLICT REPLACE, Blob1 BLOB ON CONFLICT REPLACE, Blob2 BLOB ON CONFLICT REPLACE, Blob3 BLOB ); ただし、最初の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列の新しいデータをブレンドした新しいレコードを書き込む必要がありますか?
535 sql  sqlite  upsert 

17
Postgres:存在しない場合はINSERT
Pythonを使用してpostgresデータベースに書き込みます。 sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES (" sql_string += hundred + ", '" + hundred_slug + "', " + status + ");" cursor.execute(sql_string) しかし、一部の行が同一であるため、次のエラーが発生します。 psycopg2.IntegrityError: duplicate key value violates unique constraint "hundred_pkey" 「この行が既に存在しない限り、INSERT」SQLステートメントをどのように書くことができますか? 私はこれが推奨されるような複雑なステートメントを見てきました: IF EXISTS (SELECT * FROM invoices WHERE invoiceid = '12345') UPDATE invoices SET billed …

12
Oracle:UPSERT(更新またはテーブルへの挿入?)
UPSERT操作は、テーブルにデータと一致する行がすでにあるかどうかに応じて、テーブルの行を更新または挿入します。 if table t has a row exists that has key X: update t set mystuff... where mykey=X else insert into t mystuff... Oracleには特定のUPSERTステートメントがないため、これを行うための最良の方法は何ですか?
293 sql  oracle  merge  upsert 

6
PostgreSQLでUPSERT(マージ、挿入…重複更新時)する方法
ここで非常によく寄せられる質問は、MySQLが呼び出しINSERT ... ON DUPLICATE UPDATE、標準がMERGE操作の一部としてサポートする、アップサートの実行方法です。 PostgreSQLがそれを直接サポートしていないことを考えると(pg 9.5より前)、これをどのように行いますか?以下を検討してください。 CREATE TABLE testtable ( id integer PRIMARY KEY, somedata text NOT NULL ); INSERT INTO testtable (id, somedata) VALUES (1, 'fred'), (2, 'bob'); 今、あなたは「アップサート」にタプルをしたいことを想像し(2, 'Joe')、(3, 'Alan')新しいテーブルの内容は次のようになりので、: (1, 'fred'), (2, 'Joe'), -- Changed value of existing tuple (3, 'Alan') -- Added new tuple それは人々が議論するときに話していることupsertです。重要なのは、明示的なロックを使用するか、結果として生じる競合状態から防御することによって、同じテーブルで作業する複数のトランザクションが存在する場合でも、どのようなアプローチも安全でなければならないことです。 …


6
PostgreSQLでON CONFLICTを使用してRETURNINGを使用する方法
PostgreSQL 9.5には次のUPSERTがあります。 INSERT INTO chats ("user", "contact", "name") VALUES ($1, $2, $3), ($2, $1, NULL) ON CONFLICT("user", "contact") DO NOTHING RETURNING id; 競合がない場合は、次のようなものが返されます。 ---------- | id | ---------- 1 | 50 | ---------- 2 | 51 | ---------- ただし、競合がある場合、行は返されません。 ---------- | id | ---------- id競合がない場合は新しい列を返すかid、競合する列の既存の列を返します。 これはできますか?もしそうなら、どうですか?

1
PostgreSQL INSERT ON CONFLICT UPDATE(upsert)はすべての除外値を使用します
行をアップサートし(PostgreSQL> = 9.5)、可能なINSERTを可能なUPDATEとまったく同じにしたい場合は、次のように記述できます。 INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET id=EXCLUDED.id, username=EXCLUDED.username, password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email もっと短い方法はありますか?ただ言うと、すべてのEXCLUDE値を使用します。 SQLiteで私は以前使用していました: INSERT OR REPLACE INTO tablename (id, user, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

9
SQL Serverに更新ストアドプロシージャを挿入する
レコードが存在する場合に更新を実行するストアドプロシージャを記述しました。それ以外の場合は挿入を実行します。次のようになります。 update myTable set Col1=@col1, Col2=@col2 where ID=@ID if @@rowcount = 0 insert into myTable (Col1, Col2) values (@col1, @col2) この方法でそれを書く私の背後にあるロジックは、更新がwhere句を使用して暗黙的な選択を実行し、それが0を返す場合、挿入が行われるということです。 この方法で行う代わりに、選択を行い、返された行数に基づいて更新または挿入を行う方法があります。これは、更新を行うと2つの選択(最初の明示的な選択呼び出しと更新の場所での2番目の暗黙的な呼び出し)が発生するため、非効率的であると考えました。プロシージャが挿入を行う場合、効率に違いはありません。 私の論理はここにありますか?これは、ストアドプロシージャへの挿入と更新を組み合わせる方法ですか?

7
SQLite UPSERT /更新または挿入
SQLiteデータベースに対してUPSERT / INSERT OR UPDATEを実行する必要があります。 多くの場合に役立つコマンドINSERT OR REPLACEがあります。しかし、外部キーのために自動インクリメントでIDを維持したい場合は、行を削除して新しいものを作成し、その結果、この新しい行に新しいIDがあるため、機能しません。 これはテーブルになります: プレーヤー-(IDの主キー、user_nameは一意) | id | user_name | age | ------------------------------ | 1982 | johnny | 23 | | 1983 | steven | 29 | | 1984 | pepee | 40 |
102 database  sqlite  upsert 

5
SQLite INSERT-重複キー更新(UPSERT)
MySQLには次のようなものがあります。 INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; この機能がSQLiteに存在しないことを知っている限り、2つのクエリを実行せずに同じ効果を得る方法があるかどうかを知りたいです。また、これが不可能な場合、あなたは何を好みますか: SELECT +(INSERTまたはUPDATE)または UPDATE(+ UPDATEが失敗した場合は INSERT )
98 sql  mysql  database  sqlite  upsert 

9
ONCONFLICT句で複数のconflict_targetを使用する
テーブルcol1に2つの列がありcol2、どちらも一意のインデックスが付けられています(col1は一意であり、col2も一意です)。 このテーブルに挿入し、ON CONFLICT構文を使用して他の列を更新する必要がありますが、両方の列をconflict_target句で使用することはできません。 できます: INSERT INTO table ... ON CONFLICT ( col1 ) DO UPDATE SET -- update needed columns here しかし、次のようないくつかの列に対してこれを行う方法: ... ON CONFLICT ( col1, col2 ) DO UPDATE SET ....

10
テーブルの行を更新したり、存在しない場合は挿入したりするにはどうすればよいですか?
私は次のカウンターの表を持っています: CREATE TABLE cache ( key text PRIMARY KEY, generation int ); カウンターの1つをインクリメントするか、対応する行がまだ存在しない場合はゼロに設定したいと思います。標準SQLで並行性の問題なしにこれを行う方法はありますか?操作はトランザクションの一部である場合もあれば、別個の場合もあります。 可能であれば、SQLはSQLite、PostgreSQL、MySQLで変更せずに実行する必要があります。 検索により、並行性の問題に悩まされているか、データベースに固有のアイデアがいくつか見つかりました。 INSERT新しい行を試してUPDATE、エラーが発生した場合。残念ながら、のエラーINSERTは現在のトランザクションを中止します。 UPDATEINSERT行。行が変更されていない場合は、新しい行。 MySQLにはON DUPLICATE KEY UPDATE句があります。 編集:すべての素晴らしい返信をありがとう。ポールは正しいように見えますが、これを行うための単一のポータブルな方法はありません。それは非常に基本的な操作のように聞こえるので、それは私にとって非常に驚くべきことです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.