【问题标题】:Confused about the "NEW" keyword in SQL functions对 SQL 函数中的“NEW”关键字感到困惑
【发布时间】: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


    【解决方案1】:

    作为documentation states

    数据类型记录;保存新数据库行的变量 行级触发器中的 INSERT/UPDATE 操作。

    还有

    在 [...] 返回与 NEW 的原始值不同的行值之前触发的行级触发器会更改将被插入或更新的行。

    该页面中的示例“示例 39-3。PL/pgSQL 触发器过程”也可能有所帮助。

    【讨论】:

    • 哦,我想我明白了.. 但在前面的例子中,我们也做了一个函数,然后当我们想给我们在顶部声明的东西赋值时,我们必须写 ticket_price : =(选择价格 ... WHERE 航班 = NEW.flight)。为什么我们不能只写ticket_price := price?
    • @Yuna 不确定。在那种情况下,您尝试过 NEW.price 吗?也许您可以发布一些关于这种情况的代码或创建一个新问题?
    • 抱歉回复晚了,我已经解决了,再次感谢!
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多