Postgres INSERT ON CONFLICT DO UPDATE vsINSERTまたはUPDATE

シュンユアンティー

私が持っているstock_price_alert3つの列を持つテーブルを。stock_price_idであるPRIMARY KEYともFOREIGN KEY、他のテーブルへ。以下のようなテーブル定義:

create table stock_price_alert (
    stock_price_id integer references stock_price (id) on delete cascade not null,
    fall_below_alert boolean not null,
    rise_above_alert boolean not null,
    primary key (stock_price_id)
);

私は次のいずれかを行う必要があります:

1)INSERT存在しない場合は記録する

-- query 1
INSERT INTO stock_price_alert (stock_price_id, fall_below_alert, rise_above_alert)
VALUES (1, true, false);

2)UPDATE存在する場合は記録する

-- query 2
UPDATE stock_price_alert SET
    fall_below_alert = true,
    rise_above_alert = false
WHERE stock_price_id = 1;

まず、クエリ(1)と(2)のどちらを実行するかを決定するために、テーブルに対してSELECTクエリを発行する必要がありますstock_price_alert

Postgresは以下をサポートしますINSERT INTO TABLE .... ON CONFLICT DO UPDATE ...

-- query 3
INSERT INTO stock_price_alert (stock_price_id, fall_below_alert, rise_above_alert)
VALUES (1, true, false)
ON CONFLICT (stock_price_id) DO UPDATE SET
    fall_below_alert = EXCLUDED.fall_below_alert,
    rise_above_alert = EXCLUDED.rise_above_alert;

クエリ(1)または(2)を使用する代わりに、常にクエリ(3)を使用できますか?そうすればSELECT、事前にクエリを発行する必要がなくなり、コードを簡素化するのに役立ちます。

しかし、私は疑問に思っています、これがベストプラクティスですか?クエリ(3)は、パフォーマンスの問題または望ましくない副作用を引き起こしますか?ありがとう。

ヨニ・ラビノビッチ

クエリ3は、Postgres 9.5で導入された「UPSERT」(= UPDATEまたはINSERT)のPostgres構文です。

ドキュメントから

ON CONFLICT DO UPDATEアトミックINSERTまたはUPDATE結果を保証します。独立したエラーがない場合は、同時実行性が高い場合でも、これら2つの結果のいずれかが保証されます。これは、UPSERTUPDATEまたはINSERTとも呼ばれます。

これは、達成しようとしていることのベストプラクティスです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERT query

分類Dev

Postgres INSERT ON CONFLICT with JSONB

分類Dev

ProgrammingError-sqlalchemy-on_conflict_do_update

分類Dev

Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERTクエリ

分類Dev

Return rows from INSERT with ON CONFLICT without needing to update

分類Dev

Postgres 9.5 ON CONFLICT DO SELECT

分類Dev

nodejs & postgres : best way to do select for update

分類Dev

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

分類Dev

psycopg2.NotSupportedError:INSERT with ON CONFLICT句は、INSERTまたはUPDATEルールのあるテーブルでは使用できません。

分類Dev

INSERT ... ON CONFLICT(id)DO UPDATE ...構文をシーケンスIDで使用するにはどうすればよいですか?

分類Dev

ON CONFLICT(id)DO UPDATE SETは、DELPHI10.3.1のFireDACでは機能しません

分類Dev

これは、PostgresでINSERT ON CONFLICTを一括する正しい方法ですか?

分類Dev

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

分類Dev

In Core Data, how to do `if exists update else insert` in swift 4?

分類Dev

Mongoose: atomic FindOne-Or-Insert(), do not update existing instance if found

分類Dev

Realm order of insert or update

分類Dev

ON CONFLICT DO UPDATE SET X = OLD.X + EXCLUDED.XでOLD.Xを参照する方法

分類Dev

Postgres - update CTE with incrementing values

分類Dev

Python SQLAlchemy Update Postgres Record

分類Dev

UPDATE, INSERT and ON DUPLICATE KEY UPDATE in one query

分類Dev

Insert and update a datetime into SQL database

分類Dev

Update followed by insert in a stored procedure

分類Dev

mySQL insert wont update database

分類Dev

Update MySQL table after INSERT

分類Dev

Can't update then insert in SQL

分類Dev

MySQL-存在する場合はUPDATEまたはINSERT

分類Dev

INSERTではなくJPAOneToOne UPDATE

分類Dev

Xpages multiple file attachment conflict with partial/full update

分類Dev

SQLServerでのINSERTまたはUPDATEのソリューション

Related 関連記事

  1. 1

    Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERT query

  2. 2

    Postgres INSERT ON CONFLICT with JSONB

  3. 3

    ProgrammingError-sqlalchemy-on_conflict_do_update

  4. 4

    Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERTクエリ

  5. 5

    Return rows from INSERT with ON CONFLICT without needing to update

  6. 6

    Postgres 9.5 ON CONFLICT DO SELECT

  7. 7

    nodejs & postgres : best way to do select for update

  8. 8

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

  9. 9

    psycopg2.NotSupportedError:INSERT with ON CONFLICT句は、INSERTまたはUPDATEルールのあるテーブルでは使用できません。

  10. 10

    INSERT ... ON CONFLICT(id)DO UPDATE ...構文をシーケンスIDで使用するにはどうすればよいですか?

  11. 11

    ON CONFLICT(id)DO UPDATE SETは、DELPHI10.3.1のFireDACでは機能しません

  12. 12

    これは、PostgresでINSERT ON CONFLICTを一括する正しい方法ですか?

  13. 13

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

  14. 14

    In Core Data, how to do `if exists update else insert` in swift 4?

  15. 15

    Mongoose: atomic FindOne-Or-Insert(), do not update existing instance if found

  16. 16

    Realm order of insert or update

  17. 17

    ON CONFLICT DO UPDATE SET X = OLD.X + EXCLUDED.XでOLD.Xを参照する方法

  18. 18

    Postgres - update CTE with incrementing values

  19. 19

    Python SQLAlchemy Update Postgres Record

  20. 20

    UPDATE, INSERT and ON DUPLICATE KEY UPDATE in one query

  21. 21

    Insert and update a datetime into SQL database

  22. 22

    Update followed by insert in a stored procedure

  23. 23

    mySQL insert wont update database

  24. 24

    Update MySQL table after INSERT

  25. 25

    Can't update then insert in SQL

  26. 26

    MySQL-存在する場合はUPDATEまたはINSERT

  27. 27

    INSERTではなくJPAOneToOne UPDATE

  28. 28

    Xpages multiple file attachment conflict with partial/full update

  29. 29

    SQLServerでのINSERTまたはUPDATEのソリューション

ホットタグ

アーカイブ