PostgreSQL使用触发器更新表
我想在这里使用触发器修改表CarBay的地址时清除纬度。但它删除了表中的所有纬度。我能做些什么来解决这个问题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
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在那里的答案,你就会知道原因。