Devuelve filas de INSERT con ON CONFLICT sin necesidad de actualizar
Tengo una situación en la que con frecuencia necesito obtener una fila de una tabla con una restricción única, y si no existe ninguna, entonces créela y regrese. Por ejemplo, mi tabla podría ser:
CREATE TABLE names(
id SERIAL PRIMARY KEY,
name TEXT,
CONSTRAINT names_name_key UNIQUE (name)
);
Y contiene:
id | name
1 | bob
2 | alice
Entonces me gustaría:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT DO NOTHING RETURNING id;
O quizás:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT (name) DO NOTHING RETURNING id
y que devuelva la identificación de Bob1
. Sin embargo,RETURNING
solo devuelve filas insertadas o actualizadas. Entonces, en el ejemplo anterior, no devolvería nada. Para que funcione como se desea, en realidad necesitaría:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
lo que parece un poco engorroso. Supongo que mis preguntas son:
¿Cuál es el razonamiento para no permitir el (mi) comportamiento deseado?
¿Hay alguna forma más elegante de hacer esto?