Sql 影响具有特定值的行的Postgres触发器

Sql 影响具有特定值的行的Postgres触发器,sql,postgresql,triggers,Sql,Postgresql,Triggers,我是博士后的新手,我有一个关于触发器的问题。假设我们有两张桌子。一个是城市,一个是人 城市: 人民: 我需要一个触发器,当来自该城市的所有人的表人员中的“已处理”值从0更新为1时,该触发器将表城市中的“已处理”值从0更新为1 例如:John、Ian和Claire来自柏林,当他们各自的“已处理”值更新为1时,触发器会将表cities中柏林的已处理值更新为1 最好的方法是什么 尝试此查询: with c as ( select city_id from people wh

我是博士后的新手,我有一个关于触发器的问题。假设我们有两张桌子。一个是城市,一个是人

城市:

人民:

我需要一个触发器,当来自该城市的所有人的表人员中的“已处理”值从0更新为1时,该触发器将表城市中的“已处理”值从0更新为1

例如:John、Ian和Claire来自柏林,当他们各自的“已处理”值更新为1时,触发器会将表cities中柏林的已处理值更新为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
alias c获取城市id,然后在people中为该sict id进行聚合处理,最后仅在处理完所有姓名后更新。

尝试此查询:

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
alias c获取城市id,然后在people中为该sict id进行聚合处理,最后仅在处理完所有姓名后更新。

这将起作用:

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();
这将有助于:

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();

这似乎是构造数据的错误方法。只需使用
join
查看城市是否已被处理。这似乎是构建数据的错误方式。只需使用
join
查看城市是否已被处理。