Mam tabelę tag
z 2 kolumnami: id
(uuid) i name
(tekst). Chcę teraz wstawić nowy znacznik do tabeli, ale jeśli znacznik już istnieje, chcę po prostu pobrać id
istniejący rekord.
Zakładałem, że mogę po prostu użyć ON CONFLICT DO NOTHING
w połączeniu z RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Zwraca to jednak pusty zestaw wyników, jeśli znacznik o nazwie „foo” już istnieje.
Następnie zmieniłem zapytanie, aby użyć DO UPDATE
klauzuli noop :
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Działa to zgodnie z przeznaczeniem, ale jest nieco mylące, ponieważ po prostu ustawiam nazwę na już istniejącą wartość.
Czy to jest sposób na rozwiązanie tego problemu, czy brakuje mi prostszego podejścia?
ERROR: missing FROM-clause entry for table "excluded"
podczas korzystania DO NOTHING
.
returning excluded.id
?