Ich habe eine Tabelle tag
mit 2 Spalten: id
(UUID) und name
(Text). Ich möchte jetzt ein neues Tag in die Tabelle einfügen, aber wenn das Tag bereits vorhanden ist, möchte ich einfach id
den vorhandenen Datensatz abrufen.
Ich nahm an, ich könnte nur ON CONFLICT DO NOTHING
in Kombination mit RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Dies gibt jedoch eine leere Ergebnismenge zurück, wenn das Tag mit dem Namen "foo" bereits vorhanden ist.
Ich habe dann die Abfrage geändert, um eine noop- DO UPDATE
Klausel zu verwenden:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Dies funktioniert wie beabsichtigt, ist jedoch etwas verwirrend, da ich nur den Namen auf den bereits vorhandenen Wert setze.
Ist dies der Weg, um dieses Problem zu lösen, oder gibt es einen einfacheren Ansatz, den ich vermisse?
ERROR: missing FROM-clause entry for table "excluded"
bei der Verwendung DO NOTHING
.
returning excluded.id
?