我是postgres新手,我有一個關於觸發器的問題。可以說我們有兩張桌子。一個與城市,一個與人。Postgres觸發器,影響具有特定值的行
城市:
人物:
我需要一個觸發表明更新 '處理' 在表城市從0到1的值,當在表 '處理' 值所有來自該城市的人都會從0更新爲1。
例如:約翰,Ian和克萊爾來自柏林和當「處理」值更新爲1爲他們每個人,然後觸發更新處理,柏林表城市1.
值是什麼做到這一點的最佳方式?
我是postgres新手,我有一個關於觸發器的問題。可以說我們有兩張桌子。一個與城市,一個與人。Postgres觸發器,影響具有特定值的行
城市:
人物:
我需要一個觸發表明更新 '處理' 在表城市從0到1的值,當在表 '處理' 值所有來自該城市的人都會從0更新爲1。
例如:約翰,Ian和克萊爾來自柏林和當「處理」值更新爲1爲他們每個人,然後觸發更新處理,柏林表城市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();
嘗試此查詢:
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,只有當所有的名字被處理加工的聚集。
這似乎是錯誤的方式來組織數據。只需使用「加入」來查看城市是否已經被處理。 –