PostgreSQL使用触发器更新表

PostgreSQL使用触发器更新表,sql,postgresql,triggers,Sql,Postgresql,Triggers,我想在这里使用触发器修改表CarBay的地址时清除纬度。但它删除了表中的所有纬度。我能做些什么来解决这个问题 CREATE TABLE CarBay( carBayName VARCHAR(20), address VARCHAR(50) NOT NULL, description VARCHAR(50), latitude DECIMAL(8,5), longitude DECIMA

我想在这里使用触发器修改表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
更改所有地址,因为根据定义,旧地址更新为新地址(触发器中更新地址后的
子句)。相反,您应该只清除
纬度
(可能还有
经度
),其中表中的地址等于
新的
地址

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

当您筛选
OLD.address!=NEW.address
更改所有地址,因为根据定义,旧地址更新为新地址(触发器中更新地址后的
子句)。相反,您应该只清除
纬度
(可能还有
经度
),其中表中的地址等于
新的
地址

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

天啊!在NULL后面加一个分号!update语句在那里终止,没有转到where子句和..轰!更新了所有内容,用NULL销毁了纬度列。我在想火箭科学。但多亏了你,我更好地掌握了触发器:-啊,那是个错误,我已经删除了。但这仍然是个问题。你试过扳机吗?我在某个地方读过AFTER触发器通常用于日志记录,以及AFTER触发器中关于新子句的一些捕获。现在想不起来了。所以我没有发帖。试试看。在之前不行:(从这里借用,你应该提到address=NEW.address;看到CL的答案,你会得到why.OMG!你在NULL后面加了一个分号!update语句在那里终止了,没有转到where子句和..BOOM!更新了所有内容,用NULL销毁了纬度列。我在这里想到了火箭科学。但多亏了你,我得到了一个更好地掌握触发器:-Doh,这是一个错误,我已经删除了它。但这仍然是一个问题。您是否尝试了前触发器?我在某个地方读过后触发器通常用于日志记录,以及一些关于后触发器中新子句的捕获。现在无法回忆。因此没有发布。尝试一下。否前触发器不起作用:(从这里借用,你应该提到address=NEW.address;看到CL在那里的答案,你就会知道原因。