2013-03-11 90 views
0

我一直在玩最後一個小時或更多試圖將更新語句放入觸發器。我明白UPDATE語句的概念,下面的工作只是正常Postgres - 更新語句作爲觸發器

UPDATE cars SET country = 'France'; 

我要的是投入到一個觸發該這樣,當汽車表被更新,列全國將自動與法國進行更新。

我已經嘗試過調整我在interweb上發現的函數和觸發器,但我顯然聲明錯誤,因爲它們不執行或者它們執行但不更新國家/地區字段當添加新記錄時。

CREATE FUNCTION update_country() RETURNS TRIGGER AS $$ 
BEGIN 
    IF (TG_OP = 'UPDATE') THEN 
     UPDATE cars SET country = 'France' WHERE id = New.id; 
    END IF; 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; --The trigger used to update a table. 

CREATE TRIGGER update_country_col BEFORE UPDATE ON cars FOR EACH ROW EXECUTE PROCEDURE update_country(); 

上述腳本執行但未將法國添加到國家/地區列。 該功能是根據我在網絡上發現的聲明進行調整的。

Postgres 9.1。

我知道答案會非常簡單!

+2

請出示你的PostgreSQL的版本,你寫的觸發器的代碼,相關的'CREATE語句TRIGGER',聲明帽子你」重新使用來測試它和任何錯誤信息**的確切文本。現在這與「什麼顏色是我的帽子」問題並不遙遠。什麼帽子?我看不到任何帽子! – 2013-03-11 14:43:43

+0

Postgres 9.1。 CREATE FUNCTION update_country() 返回一個觸發器AS $$ BEGIN IF(TG_OP = '更新')THEN UPDATE汽車中設置的國家= '法國' WHERE ID = New.id; END IF; RETURN NULL; END; $$語言plpgsql; - 用於更新表的觸發器。 CREATE TRIGGER update_country_col在更新汽車之前 FOR EACH ROW EXECUTE PROCEDURE update_country(); 上述腳本執行但不會將法國添加到國家/地區列。該功能是根據我在網上發現的一個聲明改編的。 – geomiles 2013-03-11 15:21:33

回答

3

在更新觸發器中,您應該修改NEW記錄。 另外,您可能需要從程序中返回NEW記錄。

所以,你應該使用下面的過程,而不是你的:

CREATE FUNCTION update_country() RETURNS TRIGGER AS $$ 
    BEGIN 
    IF (TG_OP = 'UPDATE') THEN 
    NEW.country = 'France'; 
    END IF; 
    RETURN NEW; 
    END; $$ LANGUAGE plpgsql; 
+0

該函數必須從'BEFORE UPDATE'觸發器中調用。 – 2013-03-11 15:49:17

+0

當然可以。但正如我在作者評論中看到的那樣,它已經正確完成了。 – alno 2013-03-11 15:55:01

+0

謝謝@alno我一直在玩弄完整的UPDATE語句。 – geomiles 2013-03-11 17:24:53