Триггер PostgreSQL и обновленные строки

Я пытаюсь обновить таблицу в соответствии с этим триггером:

CREATE TRIGGER alert 
AFTER UPDATE ON cars
FOR EACH ROW
EXECUTE PROCEDURE update_cars();

Триггер Функция :

CREATE FUNCTION update_cars()
RETURNS 'TRIGGER' 
AS $BODY$
BEGIN 
IF (TG_OP = 'UPDATE') THEN
UPDATE hello_cars SET status = new.status 
WHERE OLD.ID = NEW.ID;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

триггер работает нормально. Когда cars таблица обновляется,hello_cars таблица обновляется, но столбец состояния в каждой строке обновляется и содержит тот же новый статус! Он должен быть обновлен в соответствии с идентификатором автомобиля.
Я думаю, что моя проблема в условии: WHERE OLD.ID = NEW.ID; но я не могу сказать, что это неправильно.

спасибо заранее.

2 ответов


OLD и NEW являются псевдонимами строк, которые запустили триггер. Поэтому, когда вы выполняете оператор like

UPDATE cars SET status='xyz' WHERE cars.id = 42;

тогда функция триггера будет выполнять

UPDATE hello_cars SET status='xyz' WHERE 42 = 42

часть 42=42 всегда истинно. Так что каждая строка в hello_cars обновляется.

вы действительно хотите, что-то вроде

 [...]WHERE hello_cars.id = OLD.ID

или немного короче

 [...]WHERE id = OLD.ID

но вам также нужно подумать о том, что произойдет, если первоначальное обновление изменится cars.id. В этом случае OLD.ID не равно NEW.ID. Что должно произойти в таблице hello_cars в этом случае? Но это уже другой вопрос.


OLD.ID и NEW.ID ссылке значения в обновленной строке таблицы cars и таким образом (если вы не измените ID в cars) всегда будет оценивать true и поэтому все строки в hello_cars обновляются.

Я думаю, вы, вероятно, хотите:

UPDATE hello_cars
   SET status = new.status
WHERE id = new.id;

это предполагает, что есть графа id в таблице hello_cars что соответствует id на cars.