私はPostgreSQL INSERT .. ON CONFLICT UPDATE
の機能を使うことを考えています。理想的には、挿入された行と更新された行を区別することができます。それを行う方法はありますか?Postres upsert:新しい行と更新された行を区別する
1
A
答えて
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;
説明:
関連する問題
- 1. PostgreSQL Upsertは、システム列XMIN、XMAXなどを使用して、挿入され更新された行を区別します。
- 2. SQL Server 2000 - 行を更新して更新された行を返します
- 3. 更新されたテーブルの行を更新する
- 4. コードで実行されたときに更新クエリが更新されない
- 5. hibernate hql - 更新クエリ実行後に更新された行IDリストを返す
- 6. 新しいUITextFieldを選択するとUIPickerViewの行が更新されます
- 7. SQL Server - テーブルを更新し、更新された行を返します。
- 8. MySQLは別の行が変更されたときに1行を更新します
- 9. Spring Data Mongo:様々なフィールドが更新されたupsert
- 10. MYSQL:2つ以上の列が区別された最新の行を選択
- 11. MySQL:カウントされた行の更新
- 12. SQL最後に更新された行
- 13. 別のテーブルを更新した後にテーブルに新しい行を挿入
- 14. mysql innodb table lock - 別の行で1行の更新を更新する場合
- 15. 別の要素が更新された後に更新する
- 16. 更新次の行更新された行の現在の場合は0
- 17. RoR最新の「列で区別する」行を選択する
- 18. Sqlite - 新しいIDで行を更新
- 19. Qtablewidget-行が更新されない
- 20. 更新が実行されたときに通知する
- 21. トリガーで新しく作成された行の値を更新する
- 22. MongoDBクエリフィルタが更新として実行されています
- 23. 新しい行がpostgresqlに挿入されたときにテーブルの列を更新するためのトリガー?
- 24. Gridviewの行をクリックすると、別のコントロールが更新されます
- 25. PHPとMySQL更新された行を確認してください
- 26. 新しいログイン(新しいセッション)とセッションのタイムアウトを区別する方法
- 27. MongoDBの更新値と別のコレクションで実行されたクエリの結果
- 28. ある行から別の行に列を更新する
- 29. 更新された[nullでない]値を別のシートの新しい行として挿入するにはどうすればよいですか?
- 30. 更新が更新または挿入で行われたか
あなたがのための追加の補助列を必要としますこの。 – klin
このような機能を使用すると、私はこの情報を得る方法がわかりません.Klinによると、この操作で何が起こったのかを格納する列が必要です。その特定の操作を知るには別のものが必要です同時に起こる)。私が見ることができる最も良い方法は、監査テーブルを持つトリガーを持つことです。トリガは挿入と更新を監査するでしょうが、トリガを指定しても、以前のものと区別するためにその操作を識別するための何かが必要です –
insertコマンドの 'RETURNING'節がありますが、挿入と更新を区別します。ここでそれを見てください:[Insert](https://www.postgresql.org/docs/9.5/static/sql-insert.html) –