插入后在第二个 table 触发更新

Triggering an update on a second table after insert

我有两个表,A 和 P。

     A
________________
id   |  num_cars
----------
1    |  2
2    |  0
3       0

             P
__________________________
id_driver    |      id_car
--------------------------
1            |    Porsche
1            |    BMW

A.id和P.id_driver指的是同一个人。我创建了下面的触发器。这个想法是,每次我在 P 中为现有 driver 添加一个新行时,它在 A 中的对应行必须更新为具有该 ID 的人拥有的汽车总数。

CREATE OR REPLACE FUNCTION update_a() RETURNS trigger AS $$ 
BEGIN
IF TG_OP = 'INSERT' THEN
    UPDATE A a
      SET num_cars = (SELECT COUNT(NEW.id_driver)
      FROM P p
      WHERE (a.id = p.id_driver AND a.id=NEW.id_driver));
ELSIF TG_OP = 'DELETE' THEN
    UPDATE A a 
      SET num_cars = num_cars - 1
      WHERE a.id = OLD.id_driver AND a.num_cars<>0;
END IF;        
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER add_car
AFTER INSERT OR DELETE ON PARTICIPATION
FOR EACH ROW EXECUTE PROCEDURE update_a();

当我在 B 中为 driver 添加一行时,触发器工作正常。但是,如果我随后在 B 中为不同的 driver 添加一行,则 A 中的其余行将设置回 0。我希望程序仅在 A.id = P.id_driver。我该怎么做?

更新查询在 AP 之间进行叉积,因此更新整个 table,大多数时候计算 0 辆汽车。

您需要将更新限制为仅适用于正确的驱动程序,并且还需要仅为该驱动程序计算汽车数量:

UPDATE A a
SET num_cars = (SELECT COUNT(*)
      FROM P p
      WHERE p.id_driver = NEW.id_driver)
WHERE a.id = NEW.id_driver;