Вернуть строки из INSERT с ON CONFLICT без необходимости обновления

У меня есть ситуация, когда мне очень часто нужно получить строку из таблицы с уникальным ограничением, и если ее нет, создать ее и вернуть. Например, моя таблица может быть:

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

и он вернет идентификатор Боба1, Тем не мение,RETURNING возвращает только вставленные или обновленные строки. Таким образом, в приведенном выше примере он ничего не вернет. Для того, чтобы он функционировал как хотелось бы, мне на самом деле нужно:

INSERT INTO names(name) VALUES ('bob') 
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;

что кажется довольно громоздким. Я думаю, мои вопросы:

В чем причина того, что (мое) желаемое поведение запрещено?

Есть ли более элегантный способ сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос