8

したがって、私はDUPLICATE UPDATE で INSERT を実行できる MySQL から来ています。

INSERT INTO table (a,b,c) 
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

しかし、今私は PostgreSQL を使用しており、UPSERT 機能を追加するための努力があります。構文例 1私もこれを見たことがありますが、実装方法がわかりません。table1 から Table2 へのデータのマージに MERGE が使用されていると思っていたので、まだ試していません。

MERGE
INTO    table
USING   table
ON      c = 1
WHEN MATCHED THEN
UPDATE
SET     c=c+1
WHEN NOT MATCHED THEN
INSERT  (a,b,c)
VALUES  (1,2,3)

他の提案はありますか?

4

4 に答える 4

14

MERGE が利用可能になるまでは、次の堅牢なアプローチを使用してください:挿入、PostgreSQL での重複更新時に?

于 2010-12-30T01:33:20.590 に答える
3

マージがサポートされるまで、IMO の最も簡単な方法は、マージを 2 つのクエリに分割することです。

BEGIN;
  INSERT INTO t (a,b,c) VALUES (1,2,3) WHERE id != 1;
  UPDATE t SET c=c+1 WHERE id = 1;
END;

id は適切な条件に変更されます。

于 2010-12-29T23:22:58.123 に答える
0
MERGE INTO table
    USING (VALUES (1, 2, 3)) AS newvalues (a, b, c)
    ON table.c = newvalues.c  -- or whatever the PK is
    WHEN MATCHED THEN UPDATE SET c = c + 1
    WHEN NOT MATCHED THEN INSERT (a, b, c)
                              VALUES (newvalues.a, newvalues.b, newvalues.c)

ここで重要なのは、別のテーブルをマージする代わりに、句のVALUES構造を使用して定数テーブル ソースを作成することです。USING明らかに好みに合わせて調整できる正確なマージルール。

http://petereisentraut.blogspot.com/2010/05/merge-syntax.htmlも参照してください。

于 2010-12-29T17:26:50.543 に答える
0

「MERGE」はまだPostgresにはないと思いますが、9.1にはあるはずです。

代わりにRULEを使用したい

CREATE OR REPLACE RULE "insert_ignore"
AS ON INSERT TO "table" WHERE
  NEW.id = OLD.id --whatever your conditions are
DO INSTEAD NOTHING;

あなたがリンクしているもの(「挿入、重複更新時(postgresql)」)は、基本的にデータをフィードするpgsqlです。明示的に呼び出す必要がなく、実際の INSERT 内でプロシージャを呼び出す必要なくバックグラウンドで透過的に動作するため、RULE はよりエレガントだと思います。

于 2010-12-29T19:12:30.067 に答える