4

テーブルの行を更新するにはクエリが必要ですが、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;

しかし、このようなものが機能するかどうかはわかりません。どうすれば動作させ、競合状態を確認できますか?

4

1 に答える 1