对 SQL 函数中的“NEW”关键字感到困惑

Yun*_*una 4 sql postgresql triggers

我对 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)
);
Run Code Online (Sandbox Code Playgroud)

表“航班”包含有关到达等的更多信息。无论如何,现在我有这样的功能:

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';
Run Code Online (Sandbox Code Playgroud)

还有一个触发器:

CREATE TRIGGER UpdatePlane BEFORE UPDATE ON AvailableFlights
FOR EACH ROW
WHEN (NEW.plane <> OLD.plane)
EXECUTE PROCEDURE update_plane();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何在没有 SELECT 和 WHERE 条件的情况下简单地编写 NEW.nbrOfFreeSeats?它如何知道相应地更改哪一行?因为触发器只会在我写“UPDATE table SET plane = 'newVal' WHERE plane = 'oldVal'”之类的东西时触发,所以在我看来,我从来没有说明我想改变哪些 nbrSeats。或者它暗示了哪些我要换到的飞机?(澄清一下:它工作正常,我只是好奇为什么)。

我希望我说的有道理,这是我在 stackoverflow 上的第一篇文章,所以我希望我在发布这篇文章时没有犯太多错误(欢迎任何反馈,有点匆忙发布):) 提前致谢.

小智 5

正如文档所述

新的

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

并且

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

该页面中的示例“Example 39-3. A PL/pgSQL Trigger Procedure”也可能有所帮助。