我是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,只有当所有的名字被处理加工的聚集。
这似乎是错误的方式来组织数据。只需使用“加入”来查看城市是否已经被处理。 –