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

POSTGRESQL INSERT si le nom de ligne spécifique n'existe pas ?

ON DUPLICATE KEY UPDATE est la syntaxe MySQL, pas PostgreSQL. PostgreSQL n'a pas de syntaxe SQL simple pour faire ce que vous voulez.

Mais la documentation inclut un exemple de code pour une fonction qui fait cela.

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE db SET b = data WHERE a = key;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO db(a,b) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;