Tenho uma tabela tag
com 2 colunas: id
(uuid) e name
(texto). Agora quero inserir uma nova tag na tabela, mas se a tag já existir, quero simplesmente obter o id
registro existente.
Presumi que poderia usar apenas ON CONFLICT DO NOTHING
em combinação com RETURNING "id"
:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT DO NOTHING
RETURNING "id";
Mas isso retorna um conjunto de resultados vazio, se a tag com o nome "foo" já existir.
Em seguida, alterei a consulta para usar uma DO UPDATE
cláusula noop:
INSERT INTO
"tag" ("name")
VALUES( 'foo' )
ON CONFLICT ("name") DO UPDATE SET "name" = 'foo'
RETURNING "id";
Isso funciona como pretendido, mas é um pouco confuso, porque estou apenas definindo o nome para o valor já existente.
Esta é a maneira de resolver esse problema ou há uma abordagem mais simples que estou perdendo?
Isso funcionará (pelo que testei) em todos os 3 casos, se os valores a serem inseridos forem todos novos ou já estiverem na tabela ou uma mistura:
Provavelmente existem outras maneiras de fazer isso, talvez sem usar a nova
ON CONFLICT
sintaxe.Não faço ideia de como isso funcionará, mas apenas como outra opção para tentar, aqui está fazendo o mesmo da maneira antiga (sem
ON CONFLICT
):Ou seja, insira apenas os nomes [únicos] não encontrados na
tag
tabela e retorne os IDs; combine isso com os IDs dos nomes que existem emtag
, para a saída final. Você também pode jogarname
na saída, conforme sugerido por ypercubeᵀᴹ , para saber qual ID corresponde a qual nome.