У меня есть ситуация, когда мне очень часто нужно получить строку из таблицы с уникальным ограничением, а если ее нет, создайте ее и верните. Например, моя таблица может быть:
CREATE TABLE names(
    id SERIAL PRIMARY KEY,
    name TEXT,
    CONSTRAINT names_name_key UNIQUE (name)
);
И он содержит:
id | name
 1 | bob 
 2 | alice
Тогда я хотел бы:
 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT DO NOTHING RETURNING id;
Или, возможно:
 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT (name) DO NOTHING RETURNING id
и вернуть bob id 1. Однако RETURNING возвращает только вставленные или обновленные строки. Итак, в приведенном выше примере он ничего не вернет. Чтобы он функционировал по желанию, мне действительно нужно:
INSERT INTO names(name) VALUES ('bob') 
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
который кажется довольно громоздким. Я думаю, мои вопросы:
-  В чем причина недопустимости моего (желаемого) поведения? 
-  Есть ли более элегантный способ сделать это? 
