Я думал в предложении WHERE после КОНФЛИКТА, который я мог определить, когда этот конфликт «вызван». Разве это не так?
Нет. То, что определяет concflict - это target , выражение, которое следует сразу за ключевым словом ON CONFLICT
. В вашем запросе это:
on conflict(cell_id, object_id)
... что вам нужно - обратите внимание, что для этого требуется наличие уникального индекса для этого набора столбцов (или ограничения первичного ключа). Таким образом, вам не нужно (и не нужно) это предложение where
.
Кроме того, чтобы получить доступ к столбцу из другой таблицы в предложении do update
, вы можете использовать псевдостол excluded
.
Рассмотрим:
insert into reached_points(cell_id, object_id, cost)
select cell_id, object_id, reached_cost from test_reached_cells
on conflict(cell_id, object_id)
do update set cost = excluded.cost
Демонстрация на DB Fiddle :
Пример данных:
select * from reached_points;
cell_id | object_id | cost
------: | --------: | ---:
1 | 2 | 3
select * from test_reached_cells;
cell_id | object_id | reached_cost
------: | --------: | -----------:
1 | 2 | 4
1 | 3 | 4
Запрос:
insert into reached_points(cell_id, object_id, cost)
select cell_id, object_id, reached_cost from test_reached_cells
on conflict(cell_id, object_id)
do update set cost = excluded.cost
-- 2 rows affected
Результаты:
select * from reached_points;
cell_id | object_id | cost
------: | --------: | ---:
1 | 2 | 4
1 | 3 | 4