2017-06-13 29 views
0

我是postgres新手,我有一个关于触发器的问题。可以说我们有两张桌子。一个与城市,一个与人。Postgres触发器,影响具有特定值的行

城市:

enter image description here

人物:

enter image description here

我需要一个触发表明更新 '处理' 在表城市从0到1的值,当在表 '处理' 值所有来自该城市的人都会从0更新为1。

例如:约翰,Ian和克莱尔来自柏林和当“处理”值更新为1为他们每个人,然后触发更新处理,柏林表城市1.

值是什么做到这一点的最佳方式?

+2

这似乎是错误的方式来组织数据。只需使用“加入”来查看城市是否已经被处理。 –

回答

1

这将工作:

CREATE OR REPLACE FUNCTION mytrigger() RETURNS TRIGGER AS $mytrigger$ 
    BEGIN 
     IF (SELECT EXISTS (SELECT 1 FROM PEOPLE WHERE city_id = NEW.city_id AND processed = '0')) THEN 
      UPDATE CITIES SET processed = '0' WHERE id = NEW.city_id; 
      RETURN NEW; 
     ELSE 
      UPDATE CITIES SET processed = '1' WHERE id = NEW.city_id; 
      RETURN NEW; 
     END IF; 
    END; 
$mytrigger$ LANGUAGE plpgsql; 

CREATE TRIGGER mytrigger 
AFTER UPDATE ON PEOPLE 
    FOR EACH ROW EXECUTE PROCEDURE mytrigger(); 
1

尝试此查询:

with c as (
    select city_id 
    from people 
    where name = NEW.name 
) 
, a as (
select avg(processed) 
from people 
join c on c.city_id = people.city_id 
) 
update cities u 
set processed = 1 
from a 
where u.id = a.city_id 
and avg = 1 

别名Ç得到城市的ID,然后在人,最后更新的更新,SICT ID,只有当所有的名字被处理加工的聚集。