Вы могли бы действовать следующим образом:
INSERT INTO users (username, email, password)
VALUES ('newuser', 'newemail', NULL)
ON CONFLICT (username) DO NOTHING
RETURNING id;
Если вы получили пустой результат, произошло столкновение с существующим именем пользователя.
Если вы получили нарушение ограничения, былоконфликт с существующим адресом электронной почты.
Если вы получаете id
, вернитесь, установите пароль:
UPDATE users
SET password = 'newpassword'
WHERE id = v_id;
Если таблица имеет fillfactor
меньше чем100, и нет индекса password
(которого не должно быть), это могло бы быть эффективным обновлением HOT.
Но я бы измерил, если создание хэша обходится дороже, чем дополнительная обход туда и обратно...