2012-03-31 19 views
6

更新: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テーブルは更新されますが、各行のステータス列は更新され、同じ新しいステータスが含まれます。車のIDに応じて更新する必要があります。
私の問題は状態にあると思う: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.IDNEW.IDと等しくありません。この場合のテーブルhello_carsはどうなりますか?しかしそれは別の質問です。

+0

ありがとう! – Noon

+0

@Shadin:ようこそ。 [FAQ/How to Ask](http://stackoverflow.com/faq#howtoask)をご覧ください。 –

6

OLD.IDNEW.IDは(あなたがcarsでIDを変更しない限り)テーブルcarsの更新された行でので、常に真とそのhello_carsのすべての行が更新されていると評価されます値を参照しています。

私はあなたがおそらくしたいと思う:

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

これはcarsidと一致するテーブルhello_carsの列idがあることを前提としています。

+0

ありがとうございました!それは偉大な作品 – Noon

関連する問題