2013-03-11 92 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