Giả sử bảng đơn giản này:
CREATE TABLE tbl(id int primary key, value int);
Chức năng này gần như 100% an toàn (xem phần bình luận) cho các giao dịch đồng thời.:
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;
Gọi:
SELECT f_upsert(2, 2);
Nó rất giống với INSERT / SELECT
này trường hợp với giải thích thêm và liên kết:
- CHỌN hoặc CHÈN trong một hàm có nguy cơ gặp phải các điều kiện về chủng tộc không?