Триггер 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.