插入后在第二个 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。我该怎么做?
更新查询在 A
和 P
之间进行叉积,因此更新整个 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;
我有两个表,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。我该怎么做?
更新查询在 A
和 P
之间进行叉积,因此更新整个 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;