Мне нужен запрос для обновления строки в таблице, но если идентификатор не существует, он вставляет значения по умолчанию.Кроме того, он должен избегать условий гонки потоков.
Я нашел здесь ответ, который должен быть в порядке 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;
, но я не уверен, что что-то подобное может сработать.как я могу заставить его работать и быть уверенным в условиях гонки?