私が持っているstock_price_alert
3つの列を持つテーブルを。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つの結果のいずれかが保証されます。これは、UPSERT
「UPDATE
またはINSERT
」とも呼ばれます。
これは、達成しようとしていることのベストプラクティスです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加