Мне неизвестны штатные средства для этого.
В качестве обходных фокусов можно поизвращаться вот так:
with
data (new_user_id, new_name) as (values(%(user_id)s, %(name)s)),
wr as (
INSERT INTO users(user_id, name)
select new_user_id, new_name from data
ON CONFLICT (user_id) DO NOTHING returning user_id
), upd as (
update users set name = new_name from data where users.user_id = data.new_user_id and data.new_user_id not in (
select user_id from wr
)
)
select count(*) from wr;
Что работает согласно задаче из-за того, что do nothing не осуществляет insert и потому строка не появляется в returning.