2016-12-29 31 views
0

我有一個SQL插入,應該增加version列並更新主鍵衝突time列。Postgres觸發干擾'衝突做更新集'

insert into items (pk, time, version, name) 
     values (9999, now(), 1) 
     on conflict (pk) do update set 
      time = now(), 
      version = items.version + 1, 
      name = excluded.name 

一切正常,直到我添加觸發器來更新發生時存檔行。因此,如果有一行版本爲1,並且插入稍後發生,則上述查詢將使version列的值增加爲2.但我希望版本1的舊行轉到archive表。

但是,當我添加下面的觸發器時,上面的插入不會更新版本和時間列,因爲它沒有此觸發器。我如何修復觸發器?是因爲我在做return old,還是因爲它是before update觸發器?

CREATE FUNCTION archivefunction() RETURNS trigger 
    LANGUAGE plpgsql 
AS $$ 
begin 
    insert into archive (pk, time, version, name) 
    values (old.pk, old.time, old.version, old.name); 
    return old; 
    end 
$$ 

CREATE TRIGGER archivetrigger 
BEFORE UPDATE ON items 
FOR EACH ROW EXECUTE PROCEDURE archivefunction() 

回答

1

是的,是爲return old,什麼是迴歸舊的改變與舊值被更新的記錄值,你可以做一個return new;聲明,無論如何,你想要什麼,我會做它更新後觸發器的邏輯是在列表版本更新後進行歸檔,而不是在更新之前進行歸檔