【发布时间】:2023-04-09 05:55:01
【问题描述】:
我对 SQL/PostgreSQL 比较陌生,我们刚刚开始使用触发器和函数/过程。
这是两个相关的表
CREATE TABLE Planes (
regnr TEXT PRIMARY KEY,
capacity INT NOT NULL
);
CREATE TABLE AvailableFlights (
date TEXT PRIMARY KEY,
price INT NOT NULL,
nbrOfFreeSeats INT NOT NULL,
flight TEXT NOT NULL REFERENCES Flights(code),
plane TEXT NOT NULL REFERENCES Planes(regnr)
);
“航班”表包含有关到达等的更多信息。无论如何,现在我有这样的功能:
CREATE OR REPLACE FUNCTION update_plane() RETURNS TRIGGER AS $$
DECLARE
size_difference INTEGER;
BEGIN
size_difference := (SELECT capacity FROM Planes WHERE regnr = new.plane) - (SELECT capacity FROM Planes WHERE regnr = old.plane);
IF(NEW.numberOfFreeSeats + size_difference < 0) THEN
RAISE EXCEPTION 'Plane too small';
ELSE NEW.numberOfFreeSeats := NEW.numberOfFreeSeats + size_difference;
END IF;
RETURN NEW;
END
$$ LANGUAGE 'plpgsql';
还有一个触发器:
CREATE TRIGGER UpdatePlane BEFORE UPDATE ON AvailableFlights
FOR EACH ROW
WHEN (NEW.plane <> OLD.plane)
EXECUTE PROCEDURE update_plane();
所以我的问题是:我怎样才能简单地编写 NEW.nbrOfFreeSeats 而没有 SELECT 与 FROM 和 WHERE 条件?它如何知道要相应更改哪一行?因为触发器只会在我编写类似“UPDATE table SET plane = 'newVal' WHERE plane = 'oldVal' 之类的东西时触发,所以在我看来,我从来没有说明我想改变哪个 nbrSeats。或者它暗示了哪个我要换的飞机?(澄清一下:它工作正常,我只是好奇为什么)。
我希望我有任何意义,这是我在 stackoverflow 上的第一篇文章,所以我希望我在发布此内容时没有犯太多错误(尽管欢迎任何反馈,有点匆忙发布):)提前致谢。
【问题讨论】:
标签: sql postgresql triggers