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