행의 fill_rate 열을 수정할 수있는 upsert 함수가 있습니다.postgresql의 동적 upsert
CREATE FUNCTION upsert_fillrate_alarming(integer, boolean) RETURNS VOID AS '
DECLARE
num ALIAS FOR $1;
dat ALIAS FOR $2;
BEGIN
LOOP
-- First try to update.
UPDATE alarming SET fill_rate = dat WHERE equipid = num;
IF FOUND THEN
RETURN;
END IF;
-- Since its not there we try to insert the key
-- Notice if we had a concurent key insertion we would error
BEGIN
INSERT INTO alarming (equipid, fill_rate) VALUES (num, dat);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- Loop and try the update again
END;
END LOOP;
END;
' LANGUAGE 'plpgsql';
이 인수를 사용하려면이 함수를 수정할 수 있습니까? 함수가 열과 테이블을 사용하도록 수정하는 방법이 있다면 추가 보너스 포인트.
두 트랜잭션이 동시에 행을 삽입하려고하면이 작업이 수행되지 않습니다. 직렬화 가능 트랜잭션을 사용하지 않는 한. –
그리고 postgres가 함수를 위해 최적화하는 것을 허용하지 않습니다. – baash05