After reading at How to UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL? I'm curious which approach is better (and faster) for UPSERT.
I am currently writing an application where in most cases data only updates (new rows are rare) therefore I think will be better use this approach without trying to insert first (from Postgres DOCS):
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;
Or will be better use INSERT ... ON CONFLICT DO UPDATE?
