繁体   English   中英

PostgreSQL使用触发器来更新表

[英]PostgreSQL use trigger to update table

当我在这里使用触发器修改表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();

当您过滤OLD.address != NEW.address您将更改所有地址,因为根据定义,旧地址将更新为新地址(触发器中的AFTER UPDATE OF address子句)。 相反,您应该只清除表中地址等于NEW地址的latitude (可能是longitude )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM