इस साधारण तालिका को मानते हुए:
CREATE TABLE tbl(id int primary key, value int);
यह फ़ंक्शन लगभग समवर्ती लेनदेन के लिए 100% सुरक्षित (टिप्पणियां देखें)।:
CREATE OR REPLACE FUNCTION f_upsert(_id int, _value int)
RETURNS void AS
$func$
BEGIN
LOOP
UPDATE tbl SET value = _value WHERE id = _id;
EXIT WHEN FOUND;
BEGIN
INSERT INTO tbl (id, value)
VALUES (_id, _value);
RETURN;
EXCEPTION WHEN UNIQUE_VIOLATION THEN -- tbl.id has UNIQUE constraint.
RAISE NOTICE 'It actually happened!'; -- hardly ever happens
END;
END LOOP;
END
$func$ LANGUAGE plpgsql;
कॉल करें:
SELECT f_upsert(2, 2);
यह बहुत हद तक इस INSERT / SELECT
. से मिलता-जुलता है अधिक स्पष्टीकरण और लिंक के साथ मामला:
- क्या किसी ऐसे फंक्शन में SELECT या INSERT है जो दौड़ की स्थिति से ग्रस्त है?