2016-07-27 6 views
1

私はPostgreSQL INSERT .. ON CONFLICT UPDATEの機能を使うことを考えています。理想的には、挿入された行と更新された行を区別することができます。それを行う方法はありますか?Postres upsert:新しい行と更新された行を区別する

+0

あなたがのための追加の補助列を必要としますこの。 – klin

+0

このような機能を使用すると、私はこの情報を得る方法がわかりません.Klinによると、この操作で何が起こったのかを格納する列が必要です。その特定の操作を知るには別のものが必要です同時に起こる)。私が見ることができる最も良い方法は、監査テーブルを持つトリガーを持つことです。トリガは挿入と更新を監査するでしょうが、トリガを指定しても、以前のものと区別するためにその操作を識別するための何かが必要です –

+0

insertコマンドの 'RETURNING'節がありますが、挿入と更新を区別します。ここでそれを見てください:[Insert](https://www.postgresql.org/docs/9.5/static/sql-insert.html) –

答えて

1

追加の補助列が必要です(この例ではupdated)。

create table test (id int primary key, str text, updated boolean); 
insert into test values (1, 'old', false); 

insert into test values 
    (1, 'new 1', false), 
    (2, 'new 2', false) 
on conflict (id) do 
update set 
    str = excluded.str, updated = true 
returning *; 

id | str | updated 
----+-------+--------- 
    1 | new 1 | t 
    2 | new 2 | f 
(2 rows) 
+0

彼は以前の紛争から新たに更新された=真をどのように区別しますか?(別の挿入/更新)?それで私はそのような答えを提供しなかったのです。 –

+0

常に最新の状態になっている 'returning * 'の結果があるので、古い競合と新しい競合を区別する必要はありません。 – klin

+0

うん、そんなことは考えなかった。情報をありがとう。 –

2

あなたのテーブルに列を追加することなく、方法があります:

CREATE TABLE tbl(id int PRIMARY KEY, col int); 
INSERT INTO tbl VALUES (1, 1); 
INSERT INTO tbl(id, col) 
VALUES (1,11), (2,22) 
ON  CONFLICT (id) DO UPDATE 
SET col = EXCLUDED.col 
RETURNING *, (xmax = 0) AS inserted;

説明:

関連する問題