我想在此处使用触发器修改表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();
答案 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;