PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Insérer s'il n'existe pas, sinon renvoyer l'id dans postgresql

Oui, il y a returning

INSERT INTO tag ("key", "value")
SELECT 'key1', 'value1'
WHERE NOT EXISTS (
    SELECT id, "key", "value"
    FROM node_tag
    WHERE key = 'key1' AND value = 'value1'
    )
returning id, "key", "value"

Pour retourner la ligne si elle existe déjà

with s as (
    select id, "key", "value"
    from tag
    where key = 'key1' and value = 'value1'
), i as (
    insert into tag ("key", "value")
    select 'key1', 'value1'
    where not exists (select 1 from s)
    returning id, "key", "value"
)
select id, "key", "value"
from i
union all
select id, "key", "value"
from s

Si la ligne n'existe pas, elle renverra celle insérée sinon celle existante.

BTW, si la paire "clé"/"valeur" la rend unique, alors c'est la clé primaire, et il n'y a pas besoin d'une colonne id. Sauf si l'une ou les deux paires "clé"/"valeur" peuvent être nulles.