Postgresql:競合を定義するUPSERT / INSERT INTO

ヒルンベイス

これは、プラットフォームに関する私の最初の投稿です。

この画像が私がやろうとしていることを説明していることを願っています。テーブルBをテーブルAにマージしようとしています。条件が満たされた場合(A.cell = B.cell AND A.object = B.objet)、A.costをテーブルBの対応するコストで更新します。条件が満たされない場合は、BからAに行を挿入します。

これまでに試したのはアップサートですが、機能しませんでした。

INSERT INTO reached_points
SELECT B.cell_id, B.object_id, B.reached_cost
FROM test_reached_cells B
ON CONFLICT (cell_id, object_id)
WHERE (cell_id = B.cell_id AND object_id = B.object_id)
DO UPDATE SET cost = B.reached_cost

CONFLICTの後のWHERE句で、その競合が「トリガーされる」ときに定義できると思いました。そうではありませんか?ドキュメントには「[ONCONFLICTtarget action;]ターゲットは次のようになります:WHERE述語–述語付きのWHERE句」のように書かれているのでそう思いました

更新を実現する方法はありますか?条件が満たされない場合は挿入しますか?テーブルを2回比較するのは非効率的であると思われるため、2つの完全に別個のステップでそれを行うことは避けたかったのです。

GMB

CONFLICTの後のWHERE句で、その競合が「トリガーされる」ときに定義できると思いました。そうではありませんか?

いいえ。競合を定義するのはターゲット、つまりON CONFLICTキーワードの直後に続く式ですクエリでは、次のようになります。

on conflict(cell_id, object_id)

...これが必要です-これには、この列のタプル(または主キー制約)に一意のインデックスが必要であることに注意してください。したがって、このwhereは必要ありません(または必要ありません)

また、do update内の他のテーブルから列にアクセスするには、疑似テーブルを使用できますexcluded

考えてみましょう:

insert into reached_points(cell_id, object_id, cost)
select cell_id, object_id, reached_cost from test_reached_cells
on conflict(cell_id, object_id)
do update set cost = excluded.cost

DB Fiddleのデモ

サンプルデータ:

select * from reached_points;
cell_id | object_id | 費用
------:| --------:| ---:
      1 | 2 | 3
select * from test_reached_cells;
cell_id | object_id | リーチコスト
------:| --------:| -----------:
      1 | 2 | 4
      1 | 3 | 4

クエリ:

insert into reached_points(cell_id, object_id, cost)
select cell_id, object_id, reached_cost from test_reached_cells
on conflict(cell_id, object_id)
do update set cost = excluded.cost
-- 2 rows affected

結果:

select * from reached_points;
cell_id | object_id | 費用
------:| --------:| ---:
      1 | 2 | 4
      1 | 3 | 4

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Postgresql:競合を定義するUPSERT / INSERT INTO

分類Dev

PostgreSQLでUPSERT(MERGE、INSERT ... ON DUPLICATE UPDATE)する方法は?

分類Dev

sqlalchemyの競合を区別する方法INSERT…ONCONFLICT(アップサート)

分類Dev

PostgreSQLの「INSERT ... ONCONFLICT」(UPSERT)機能をflask_sqlalchemyで使用するにはどうすればよいですか?

分類Dev

PostgreSQL INSERT ON CONFLICT UPDATE(upsert)はすべての除外値を使用します

分類Dev

postgresql:INSERT INTO ...(SELECT * ...)

分類Dev

insert of multi columns with "with" in postgresql

分類Dev

Postgresql upsertは競合時にIDを返しますか?

分類Dev

How to improve PostgreSQL performance on INSERT?

分類Dev

Ignore error in batch insert Postgresql

分類Dev

PostgreSQL BIGSERIAL and "duplicate key" on insert

分類Dev

postgresql:INSERT INTO…(SELECT *…、 "固定値")

分類Dev

INSERT がルックアップ テーブルの外部キー制約と競合する

分類Dev

Postgresql:個別のUPSERT(INSERT INTO ... ON CONFLICT)と単一のコマンドへの結合の効率

分類Dev

Meteor、「/ users / insert」はすでに定義されています

分類Dev

型クラスの実装で変数を定義する際の競合

分類Dev

std :: vector :: insertは定義上予約されていますか?

分類Dev

Postgresql INSERT-auto get next id?

分類Dev

insert record in android studio (kotlin) using postgresql

分類Dev

Cannot insert character 'N' to PostgreSQL in Sequelize

分類Dev

SQLServerでidentity_insertをonに設定する方法

分類Dev

Postgres UPSERTは、UPDATE時にINSERTからの列値を再利用します

分類Dev

複合外部キーINSERT

分類Dev

競合する宣言のC ++標準定義

分類Dev

関数定義でdoubleと競合する型

分類Dev

UIPageViewController 定義が以前の値と競合する

分類Dev

SETを使用してmysqlでLAST_INSERT_IDユーザー定義変数を作成するにはどうすればよいですか?

分類Dev

複数の列のSELECTとINSERT間の競合状態

分類Dev

INSERTステートメントでの外部キーの競合

Related 関連記事

  1. 1

    Postgresql:競合を定義するUPSERT / INSERT INTO

  2. 2

    PostgreSQLでUPSERT(MERGE、INSERT ... ON DUPLICATE UPDATE)する方法は?

  3. 3

    sqlalchemyの競合を区別する方法INSERT…ONCONFLICT(アップサート)

  4. 4

    PostgreSQLの「INSERT ... ONCONFLICT」(UPSERT)機能をflask_sqlalchemyで使用するにはどうすればよいですか?

  5. 5

    PostgreSQL INSERT ON CONFLICT UPDATE(upsert)はすべての除外値を使用します

  6. 6

    postgresql:INSERT INTO ...(SELECT * ...)

  7. 7

    insert of multi columns with "with" in postgresql

  8. 8

    Postgresql upsertは競合時にIDを返しますか?

  9. 9

    How to improve PostgreSQL performance on INSERT?

  10. 10

    Ignore error in batch insert Postgresql

  11. 11

    PostgreSQL BIGSERIAL and "duplicate key" on insert

  12. 12

    postgresql:INSERT INTO…(SELECT *…、 "固定値")

  13. 13

    INSERT がルックアップ テーブルの外部キー制約と競合する

  14. 14

    Postgresql:個別のUPSERT(INSERT INTO ... ON CONFLICT)と単一のコマンドへの結合の効率

  15. 15

    Meteor、「/ users / insert」はすでに定義されています

  16. 16

    型クラスの実装で変数を定義する際の競合

  17. 17

    std :: vector :: insertは定義上予約されていますか?

  18. 18

    Postgresql INSERT-auto get next id?

  19. 19

    insert record in android studio (kotlin) using postgresql

  20. 20

    Cannot insert character 'N' to PostgreSQL in Sequelize

  21. 21

    SQLServerでidentity_insertをonに設定する方法

  22. 22

    Postgres UPSERTは、UPDATE時にINSERTからの列値を再利用します

  23. 23

    複合外部キーINSERT

  24. 24

    競合する宣言のC ++標準定義

  25. 25

    関数定義でdoubleと競合する型

  26. 26

    UIPageViewController 定義が以前の値と競合する

  27. 27

    SETを使用してmysqlでLAST_INSERT_IDユーザー定義変数を作成するにはどうすればよいですか?

  28. 28

    複数の列のSELECTとINSERT間の競合状態

  29. 29

    INSERTステートメントでの外部キーの競合

ホットタグ

アーカイブ