2017-06-13 28 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,只有當所有的名字被處理加工的聚集。