2014-04-01 30 views
0
功能問題

我有一個表稱爲「subject_101」,並暫且它有三列,「ID」其中有反對的序列,「DATE_CREATED」已經「現在SET DEFAULT( )'應用於它,最後一列叫做'參考'。我已成功創建一個更新聲明,它將加入'ID''date_created'字段使用;與PostgreSQL的

UPDATE test.subject_101 set reference = id || '/' || (EXTRACT(YEAR FROM date_created)); 

並且這產生期​​望的結果。例如4/2014

我想變得更聰明一點,並將其作爲函數/觸發器創建,但我遇到了下面的代碼問題。看來會發生的是,當我插入新記錄時,我的'參考'列保持爲NULL。

CREATE OR REPLACE FUNCTION reference_number() 
      RETURNS TRIGGER AS $$ 
      BEGIN 
       IF (TG_OP = 'INSERT') THEN 
       NEW.reference = id || '/' || (EXTRACT(YEAR FROM date_created)); 
       END IF; 
       RETURN NEW; 
      END; 
      $$ language 'plpgsql' 

CREATE TRIGGER create_reference_number BEFORE UPDATE ON test.subject_101 
FOR EACH ROW EXECUTE PROCEDURE reference_number(); 

任何指針都會很棒。

+0

我認爲在觸發之前,「ID」列將不會被填充,因此連接會產生NULL。嘗試更新觸發器 –

+3

個人而言,我會避免完全創建這樣的列,而是根據需要生成它。 –

回答

0

如果你想要這個觸發器觸發對INSERT對,我從你的函數的執行收集你應該創建觸發器的桌子前插入未更新前

BEFORE UPDATE意味着它只能在UPDATE語句火災。

順便說一句,我與克雷格林格,這是一般不是一個好主意,創造這樣的專欄。

+0

你會建議作爲替代方案嗎?所有的參考系統,我的工作增量,然後是一年,例如4/2014 – geomiles