2012-03-31 4 views
6

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

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

Trigger Функция:

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;, но я не могу сказать, что случилось.

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

ответ

5

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

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 в этом случае? Но это еще один вопрос.

+0

Спасибо вам большое! – Noon

+0

@Shadin: Добро пожаловать. Пожалуйста, см. [FAQ/Как задать] (http://stackoverflow.com/faq#howtoask), как принять ответ, который вам больше всего помог. –

6

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

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

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

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

+0

Спасибо вам большое! он отлично работает – Noon

Смежные вопросы