Postgresql
在 PostgreSQL 中實現 UPSERT 的慣用方式
我已經閱讀了
UPSERT
PostgreSQL 中的不同實現,但所有這些解決方案都相對較舊或相對陌生(例如,使用可寫 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');