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

3
PostgreSQLにUPSERTを実装する慣用的な方法
UPSERTPostgreSQLのさまざまな実装について読んだことがありますが、これらのソリューションはすべて比較的古く、または比較的エキゾチックです(たとえば、書き込み可能なCTEを使用)。 そして、これらのソリューションが推奨されているため古くなっているのか、それとも(ほとんどすべてがそうである)実稼働での使用に適さない単なるおもちゃの例であるのかをすぐに調べるのは、psqlの専門家ではありません。 PostgreSQLでUPSERTを実装する最もスレッドセーフな方法は何ですか?

2
単一のクエリを使用して挿入または更新する方法は?
私は、主キーと自動インクリメントされた名前の列IDを持つテーブルテストを持っています。レコードがない場合にのみ、新しいレコードを挿入します。たとえば、 入力はid = 30122および名前= johnです ID 30122のレコードがある場合、名前列をjohnに更新し、レコードがない場合、新しいレコードを挿入します。 私は次のような2つのクエリを使用して行うことができます select * from test where id=30122 いくつかのレコードがある場合は、使用できます update test set name='john' where id=3012 またはレコードがない場合は、使用できます insert into test(name) values('john') しかし、私は単一のクエリを使用したいですか? 誰かがその可能性を伝えることができますか?

2
upsertで競合する行のIDを取得する方法は?
tag2つの列を持つテーブルがあります:id(uuid)とname(text)。テーブルに新しいタグを挿入したいのですが、タグが既に存在する場合idは、既存のレコードを取得するだけです。 私はちょうどON CONFLICT DO NOTHINGと組み合わせて使用できると仮定しましたRETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; ただし、「foo」という名前のタグがすでに存在する場合、これは空の結果セットを返します。 次に、noop DO UPDATE句を使用するようにクエリを変更しました。 INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; これは意図したとおりに機能しますが、名前を既存の値に設定しているだけなので、やや混乱します。 これはこの問題を解決する方法ですか、それとも私が見逃しているより簡単なアプローチがありますか?


1
要素をテーブルにアップサートするときに「列参照があいまいです」
データベースとしてPostgreSQLを使用しています。そして、データベースにエントリを作成する必要があります。それが既に存在する場合は、そのフィールドを更新するだけですが、フィールドの1つは、設定されていない場合にのみ更新する必要があります。 私はこの質問の情報を使用しました:https : //stackoverflow.com/questions/13305878/dont-update-column-if-update-value-is-null、それは私が持っているものとかなり関連しています。 このクエリを使用しようとしましたが、実行すると次のエラーが発生しColumn reference 'affiliate_code' is ambiguousます。 INSERT INTO accounts (id, token, affiliate_code) VALUES (value1, value2, value3) ON CONFLICT (id) DO UPDATE SET token = value2, affiliate_code = COALESCE(affiliate_code, value3); (もちろん、実際の値は置き換えられます)。 で置き換えるaffiliate_code = COALESCE(affiliate_code, value3)とaffiliate_code = value3、すべてが機能しますが、希望どおりには機能しません。 どうすればこれを機能させることができますか? これが私のテーブルの定義方法です: CREATE TABLE accounts ( id VARCHAR NOT NULL UNIQUE, …

1
UPSERT-MERGEまたは@@ rowcountに代わるより良い代替手段はありますか?[閉まっている]
ここで何が尋ねられているかを伝えるのは難しいです。この質問は曖昧、曖昧、不完全、過度に広範、または修辞的であり、現在の形式では合理的に答えることができません。この質問を明確にして、再開できるようにするには、ヘルプセンターに アクセスしてください。 7年前に閉鎖されました。 UPSERTの概念に似たT-SQLコマンドに出会ったことがありますか?オプション(1)または(2)を使用してINSERT | UPDATE操作を実行すると、過度に複雑でエラーが発生しやすくなります。 目的 目的のレコード(この場合、employee_id 1)が最新であり、本質的に同じクエリを2回記述する必要がないことを確認します。 環境 テーブル名:従業員 従業員ID:主キーがあり、IDプロパティがtrueに設定されています オプション SQL UPDATEを実行... @@ rowcount = 0および@@ error = 0をチェック...必要に応じてSQL INSERTを実行 con:同じクエリを、挿入として1回、更新として1回、事実上2回記述する必要があります con:より多くのコード=より多くの時間入力 con:より多くのコード=より多くのエラーの余地 /programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure「@@ rowcountを使用して更新」 SQL MERGEを実行します con:同じクエリを、挿入として1回、更新として1回、事実上2回記述する必要があります con:より多くのコード=より多くの時間入力 con:より多くのコード=より多くのエラーの余地 http://technet.microsoft.com/en-us/library/bb510625.aspx「T-SQLマージ」 SQL UPSERTを実行します(機能は存在しません) pro:データとテーブルの関係を一度定義します(SQL ServerがINSERTかUPDATEかどうかを心配させます) pro:コードの削減=実装の高速化 pro:少ないコード=低い確率 UPSERTの例 UPSERT employeee(employee_id、employee_number、job_title、first_name、middle_name、surname、modified_at)VALUES(1、'00 -124AB37 '、' Manager '、' John '、' T …

2
NULL値に関するPostgreSQL UPSERTの問題
Postgres 9.5の新しいUPSERT機能の使用に問題があります 別のテーブルからデータを集計するために使用されるテーブルがあります。複合キーは20列で構成され、そのうち10列はNULL可能です。以下に、特にNULL値を使用して、私が抱えている問題のより小さなバージョンを作成しました。 CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); このクエリの実行は、必要に応じて機能します(最初の挿入、その後の挿入は単純にカウントを増やします)。 INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

1
xmlパラメータを使用して複数のデータをアップサートするときにマージクエリの使用を回避する方法
値の配列でテーブルを更新しようとしています。配列の各項目には、SQL Serverデータベースのテーブルの行と一致する情報が含まれています。行がテーブルに既に存在する場合、その行を指定された配列の情報で更新します。それ以外の場合は、テーブルに新しい行を挿入します。基本的にアップサートについて説明しました。 現在、私はこれを、XMLパラメーターを受け取るストアード・プロシージャーで実現しようとしています。テーブル値パラメーターではなくXMLを使用する理由は、後者の場合、SQLでカスタムタイプを作成し、このタイプをストアドプロシージャに関連付ける必要があるためです。将来、ストアドプロシージャまたはdbスキーマの何かを変更した場合、ストアドプロシージャとカスタムタイプの両方をやり直す必要があります。このような状況は避けたいです。さらに、データ配列のサイズが1000を超えることはないため、TVPがXMLよりも優れていることは、私の状況では役に立ちません。これは、ここで提案されているソリューションを使用できないことを意味します。SQLServer 2008でXMLを使用して複数のレコードを挿入する方法 また、ここでの同様のディスカッション(UPSERT-MERGEまたは@@ rowcountのより良い代替案はありますか?)は、テーブルに複数の行をアップサートしようとしているため、私が求めているものとは異なります。 次の一連のクエリを使用して、xmlから値を更新することを望んでいました。しかし、これはうまくいきません。このアプローチは、入力が単一の行である場合にのみ機能すると想定されています。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 次の代替方法は、完全なIF EXISTSまたは次の形式のバリエーションの1つを使用することです。しかし、私は次善の効率であることを理由にこれを拒否します: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 次のオプションは、http://www.databasejournal.com/features/mssql/using-the-merge-statement-to-perform-an-upsert.htmlで説明されているようにMergeステートメントを使用することでした。しかし、それから私はここでマージクエリの問題について読みました:http : …

3
SQL Server 2005デッドロックシナリオのトラブルシューティング
デッドロックのシナリオに遭遇しています。デッドロックの唯一の関係者は、単一のテーブルと、そのテーブルから削除する単一のストアドプロシージャであるように見えます。エラーログのトレースを解読するガイドラインとして以下のMSDNの記事を使用して、これらのデッドロックのいくつかの時点でのSQLエラーログの私の分析に基づいて、その結論を導き出しました。 テーブルDEXTableとストアドプロシージャClearDEXTableRowsを以下に定義します。DEXTableに行を挿入する別のストアドプロシージャInsertDEXTableRowがありますが、そのプロシージャはSQLエラーログのエントリに基づくデッドロックに関与していないようです。 DEXTableには約830万行があり、着実に成長する傾向があります。回答者のテーブルも大きく、着実に成長する傾向があります。 ClearDEXTableRowsとInsertDEXTableRowをすばやく連続して頻繁に呼び出すページがある、トラフィック量の多いWebサイトからアクセスされます。 デッドロックは、過去10日間、1日あたり0〜9回発生しました。 1222のSQLトレースを有効にし(DBCC TRACEON 1222を使用)、最近フラグ1204を有効にしました。デッドロックの検出と終了に関するこれらのフラグの出力については、適切な説明があります 私の質問は: この1つのストアドプロシージャClearDEXTableRowsだけがデッドロックの原因であることは理にかなっていますか? もしそうなら、誰もがこれがどのように起こり得るかの良い説明を提供し、それを修正する方法を勧めることができますか? 私の疑いは、DELETEステートメントが頻繁に再構築する必要があるDEXTableのPKで競合を引き起こしていることです。 そうでない場合、デッドロックの原因をさらに掘り下げるには、どのような追加のトレースを有効にする必要がありますか?(私はここで学びたいです) -- Table definition CREATE TABLE [dbo].[DEXTable]( [ExportID] [int] NOT NULL, [RespondentID] [int] NOT NULL, [Exported] [datetime] NOT NULL, CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED ( [ExportID] ASC, [RespondentID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = …

2
PostgreSQL Upsertがパーティションテーブルで機能しない
次のようなテーブルがあります。 CREATE TABLE aggregated_master ( "user" BIGINT, type TEXT, date TIMESTAMP, operations BIGINT, amount NUMERIC, PRIMARY KEY ( "user", type, date ) ); このテーブルは、多くのパーティションが継承するマスターです。パーティションは、DATEフィールドのMONTHによって行われます。たとえば、Aug-2017のパーティションはagg_201708で、そのPKはpk_agg_201708になります。挿入を適切なパーティションにリダイレクトする通常のトリガーBEFORE INSERTがあります。 事は私がこのテーブルにUPSERTをしたいということです。DO CONFLICT部分が機能していません。 最初のコードはこのようなものでした INSERT INTO aggregated_master (user, type, date, oeprations, amount) SELECT user, type, date, SUM(ops), SUM(amt) FROM ... WHERE ... GROUP BY USER, TYPE, …

1
CTEが失われた更新を受け入れるのはなぜですか?
クレイグリンガーがコメントしたときの意味がわかりません。 挿入トランザクションがロールバックすると、このソリューションは更新が失われる可能性があります。UPDATEが行に影響を与えたことを確認するチェックはありません。 上https://stackoverflow.com/a/8702291/14731。失われた更新がどのように発生するかを示すイベントのサンプルシーケンスを提供してください(例:スレッド1がX、スレッド2がY)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.