Запуск обновления второй таблицы после вставки - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть две таблицы, 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 для существующего водителя, соответствующая строка в A должна обновляться с учетом общего количества автомобилей, принадлежащих человеку с таким идентификатором.

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 для драйвера.Однако, если я затем добавлю строку для другого драйвера в B, остальные строки в A будут установлены обратно на 0. Я бы хотел, чтобы процедура запускалась только тогда, когда A.id = P.id_driver.Как я могу это сделать?

1 Ответ

0 голосов
/ 20 ноября 2018

Запрос на обновление создает перекрестное произведение между A и P и поэтому обновляет всю таблицу, большую часть времени считая 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;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...