Zeilen von INSERT mit ON CONFLICT zurückgeben, ohne dass ein Update erforderlich ist

Ich habe eine Situation, in der ich sehr häufig eine Zeile aus einer Tabelle mit einer eindeutigen Einschränkung abrufen muss. Wenn keine vorhanden ist, dann erstelle sie und kehre zurück. Zum Beispiel könnte meine Tabelle sein:

CREATE TABLE names(
    id SERIAL PRIMARY KEY,
    name TEXT,
    CONSTRAINT names_name_key UNIQUE (name)
);

Und es enthält:

id | name
 1 | bob 
 2 | alice

Dann möchte ich:

 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT DO NOTHING RETURNING id;

Oder vielleicht

 INSERT INTO names(name) VALUES ('bob')
 ON CONFLICT (name) DO NOTHING RETURNING id

und lassen Sie es Bob's ID zurückgeben1. Jedoch,RETURNING gibt nur eingefügte oder aktualisierte Zeilen zurück. Im obigen Beispiel würde es also nichts zurückgeben. Damit es wie gewünscht funktioniert, müsste ich tatsächlich:

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

Das scheint irgendwie umständlich. Ich denke meine Fragen sind:

Was ist der Grund dafür, das (meine) gewünschte Verhalten nicht zuzulassen?

ibt es einen eleganteren Weg, dies zu tu

Antworten auf die Frage(2)

Ihre Antwort auf die Frage