Postgresql

在 PostgreSQL 中實現 UPSERT 的慣用方式

  • September 24, 2015

我已經閱讀了UPSERTPostgreSQL 中的不同實現,但所有這些解決方案都相對較舊或相對陌生(例如,使用可寫 CTE)。

而且我根本不是 psql 專家,無法立即找出這些解決方案是否過時,因為它們受到了很好的推薦,或者它們(嗯,幾乎所有這些都是)只是不適合生產使用的玩具範例。

在 PostgreSQL 中實現 UPSERT 的最執行緒安全的方法是什麼?

PostgreSQL 現在有UPSERT


根據類似 StackOverflow 問題的首選方法目前如下:

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;

SELECT merge_db(1, 'david');
SELECT merge_db(1, 'dennis');

引用自:https://dba.stackexchange.com/questions/13468