2010-06-07 2 views
0

행의 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'; 

이 인수를 사용하려면이 함수를 수정할 수 있습니까? 함수가 열과 테이블을 사용하도록 수정하는 방법이 있다면 추가 보너스 포인트.

답변

0

간단한 접근 방법, 단지 적은 라인) 다른 방법으로

CREATE OR REPLACE FUNCTION upsert_tableName(arg1 type, arg2 type) RETURNS VOID AS $$ 
DECLARE 
BEGIN 
    UPDATE tableName SET col1 = value WHERE colX = arg1 and colY = arg2; 
    IF NOT FOUND THEN 
    INSERT INTO tableName values (value, arg1, arg2); 
    END IF; 
END; 
$$ LANGUAGE 'plpgsql'; 
3

, 당신이 절은 그들이 성공할 수 있도록하는 위치에 삽입 + 업데이트를 사용하여없이 기능을 upsert 을 수행 할 수 있습니다 오른쪽의 경우. 예 :

update mytable set col1='value1' where (col2 = 'myId'); 
insert into mytable select 'value1', 'myId' where not exists (select 1 from mytable where col2='myId'); 

그러면 사용자 정의 포스트그레스 관련 기능이 많이 필요하지 않습니다.

+1

두 트랜잭션이 동시에 행을 삽입하려고하면이 작업이 수행되지 않습니다. 직렬화 가능 트랜잭션을 사용하지 않는 한. –

+0

그리고 postgres가 함수를 위해 최적화하는 것을 허용하지 않습니다. – baash05