У меня есть таблица tag
с 2 столбцами: id
(UUID) и name
(текст). Теперь я хочу вставить новый тег в таблицу, но если тег уже существует, я хочу просто получить id
существующую запись.
Я предположил, что я мог бы просто использовать ON CONFLICT DO NOTHING
в сочетании с RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Но это возвращает пустой набор результатов, если тег с именем «foo» уже существует.
Затем я изменил запрос, чтобы использовать предложение noop DO UPDATE
:
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
?