PostgreSQL使用触发器来更新表

时间:2016-04-23 10:05:51

标签: sql postgresql triggers

我想在此处使用触发器修改表CarBay的地址时清除纬度。但它会删除此表中的所有纬度。我该怎么做才能解决这个问题?

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();

1 个答案:

答案 0 :(得分:0)

当您过滤OLD.address != NEW.address时,您更改了所有地址,因为根据定义,旧地址会更新为新地址(触发器中的AFTER UPDATE OF address子句)。相反,您应该只清除表中地址等于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;