Вернуть строки из 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;
что кажется довольно громоздким. Я думаю, мои вопросы:
В чем причина того, что (мое) желаемое поведение запрещено?
Есть ли более элегантный способ сделать это?