J'ai un tableau tag
avec 2 colonnes: id
(uuid) et name
(text). Je veux maintenant insérer une nouvelle balise dans la table, mais si la balise existe déjà, je veux simplement obtenir le id
de l'enregistrement existant.
J'ai supposé que je pouvais simplement l'utiliser ON CONFLICT DO NOTHING
en combinaison avec RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Mais cela renvoie un jeu de résultats vide, si la balise avec le nom "foo" existe déjà.
J'ai ensuite modifié la requête pour utiliser une DO UPDATE
clause noop :
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Cela fonctionne comme prévu, mais c'est un peu déroutant, car je ne fais que définir le nom sur la valeur déjà existante.
Est-ce la façon de régler ce problème ou y a-t-il une approche plus simple qui me manque?
ERROR: missing FROM-clause entry for table "excluded"
lors de l'utilisation DO NOTHING
.
returning excluded.id
?