2016-04-23 8 views
1

ここでトリガーを使用してテーブルCarBayのアドレスを変更すると、緯度をクリアしたかったのです。しかし、この表のすべての緯度を削除します。この問題を解決するにはどうすればよいですか?PosgreSQLはテーブルを更新するためにトリガーを使用します

あなたが定義によって古いアドレスを新しいアドレス(トリガーで AFTER UPDATE OF address句)に更新されるので、あなたはすべてのアドレスを変更 OLD.address != NEW.addressフィルタリング
CREATE TABLE CarBay(
     carBayName VARCHAR(20), 
     address  VARCHAR(50)  NOT NULL, 
     description VARCHAR(50), 
     latitude  DECIMAL(8,5), 
     longitude DECIMAL(8,5), 
     PRIMARY KEY (carBayName) 
); 

    CREATE FUNCTION changeBayName() RETURNS trigger AS $$ 
     BEGIN 
      UPDATE CarBay 
      SET latitude = NULL 
      WHERE OLD.address != NEW.address; 
      RETURN NEW; 
     END 
    $$ LANGUAGE plpgsql; 

    CREATE TRIGGER changeBay AFTER UPDATE OF address ON CarBay 
         FOR EACH ROW 
         EXECUTE PROCEDURE changeBayName(); 
+0

OMG!あなたはNULLの後にセミコロンを入れます!更新ステートメントはそこで終了し、where節に移動していないし、..BOOM!すべてを更新し、緯度の列をNULLで破壊しました。そして私はここでロケット科学を考えていました。しかし、あなたのおかげで、私はトリガーのより良いグリップを得ました: - D –

+0

ああ、それは間違いだった、私はすでにそれを削除しました。しかしそれはまだこの問題です。 –

+0

BEFOREトリガーを試しましたか?私はどこかで読んでいたAFTERトリガーは通常ロギングに使用され、いくつかはAFTERトリガーのNEW節に関してキャッチされます。今思い出すことができません。だから投稿しなかった。試してみる。 –

答えて

0

。代わりに、latitude(おそらくlongitude)は、テーブル内のアドレスがNEWのアドレスと等しい場合にのみクリアする必要があります。

CREATE FUNCTION changeBayName() RETURNS trigger AS $$ 
BEGIN 
    UPDATE CarBay 
    SET latitude = NULL, longitude = NULL 
    WHERE address = NEW.address; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
関連する問題