У мене є таблиця tag
з 2 стовпцями: id
(uuid) та name
(text). Зараз я хочу вставити новий тег у таблицю, але якщо тег уже існує, я хочу просто отримати id
існуючий запис.
Я припускав, що я можу просто використовувати ON CONFLICT DO NOTHING
в поєднанні з RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Але це повертає порожній набір результатів, якщо тег із назвою "foo" вже існує.
Потім я змінив запит, щоб використовувати DO UPDATE
пункт noop :
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Це працює за призначенням, але це дещо заплутано, тому що я просто встановлюю ім’я на вже існуюче значення.
Це спосіб вирішити цю проблему чи є простіший підхід, якого я відсутній?
ERROR: missing FROM-clause entry for table "excluded"
під час використання DO NOTHING
.
returning excluded.id
?