2012-03-31 28 views
6

Tôi cố gắng để cập nhật một bảng theo kích hoạt này:PostgreSQL Kích hoạt và các hàng được cập nhật

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

Kích hoạt chức năng:

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; 

Trigger hoạt động tốt. Khi bảng cars được cập nhật, bảng hello_cars được cập nhật nhưng cột trạng thái trong mỗi hàng được cập nhật và có cùng trạng thái mới! Nó phải được cập nhật theo một ID xe hơi.
Tôi nghĩ rằng vấn đề của tôi là trong điều kiện: WHERE OLD.ID = NEW.ID; nhưng tôi không thể nói những gì sai.

Xin cảm ơn trước.

Trả lời

5

OLDNEW là bí danh cho các hàng kích hoạt trình kích hoạt. Vì vậy, khi bạn thực hiện một tuyên bố như

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

sau đó chức năng kích hoạt sẽ thực hiện

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

Phần 42=42 luôn luôn là sự thật. Vì vậy, mỗi hàng trong hello_cars được cập nhật.

Bạn thực sự muốn một cái gì đó giống như

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

hoặc ngắn hơn một chút

[...]WHERE id = OLD.ID 

Nhưng bạn cũng cần phải suy nghĩ về những gì sẽ xảy ra, nếu bản cập nhật đầu tiên thay đổi cars.id. Trong trường hợp này OLD.ID không bằng NEW.ID. Điều gì sẽ xảy ra trong bảng hello_cars trong trường hợp này? Nhưng đó là một câu hỏi khác.

+0

Cảm ơn bạn rất nhiều! – Noon

+0

@Shadin: Bạn được chào đón. Vui lòng xem [FAQ/How To Ask] (http://stackoverflow.com/faq#howtoask) cách chấp nhận câu trả lời đã giúp bạn nhiều nhất. –

6

OLD.IDNEW.ID đang tham chiếu giá trị trong dòng cập nhật của bảng cars và do đó (trừ khi bạn thay đổi ID trong cars) sẽ luôn luôn đánh giá đúng sự thật và do tất cả các hàng trong hello_cars được cập nhật.

Tôi nghĩ rằng có thể bạn muốn:

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

này giả định rằng có một cột id trong bảng hello_cars phù hợp với id trong cars.

+0

Cảm ơn bạn rất nhiều! nó hoạt động tuyệt vời – Noon

Các vấn đề liên quan