テーブルの行を更新するにはクエリが必要ですが、ID が存在しない場合はデフォルト値が挿入されます。また、スレッドの競合状態を回避する必要があります。
ここで問題ないはずの答えを見つけました https://stackoverflow.com/a/7927957/8372336
このクエリの使用:
UPDATE tbl x
SET tbl_id = 24
, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
したがって、更新後に古い値を返す必要があり、スレッドの競合状態を防ぐ必要があると思います。
ただし、行が存在しない場合は挿入を追加し、今回は挿入された値も返す必要があります (古い値は存在しないため意味がありません)。
だから基本的に私は何かをする必要があります
INSERT INTO tbl
(...) VALUES (...)
RETURNING ..., ...
ON CONFLICT DO
UPDATE tbl x
SET tbl_id = 24
, name = 'New Gal'
FROM (SELECT tbl_id, name FROM tbl WHERE tbl_id = 4 FOR UPDATE) y
WHERE x.tbl_id = y.tbl_id
RETURNING y.tbl_id AS old_id, y.name AS old_name, x.tbl_id, x.name;
しかし、このようなものが機能するかどうかはわかりません。どうすれば動作させ、競合状態を確認できますか?