sql - 对SQL函数中的 "NEW"关键字感到困惑

标签 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)
);

“航类”表包含有关到达等的更多信息。不管怎样,现在我有了这样的功能:

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();

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

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

最佳答案

作为documentation states

NEW

Data type RECORD; variable holding the new database row for INSERT/UPDATE operations in row-level triggers.

还有

Row-level triggers fired BEFORE [...] Returning a row value different from the original value of NEW alters the row that will be inserted or updated.

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

关于sql - 对SQL函数中的 "NEW"关键字感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42280471/

相关文章:

Mysql - Concat - 过程执行失败

c# - 禁用 CAST AS 以优化 Entity Framework 中的查询

mysql - SQL 查询 Ailas 问题

postgresql - 数据库触发器限制 Postgres 中的最大表大小

sql - 相互组合查询

sql - 为什么以下 Postgres SQL 查询需要这么长时间?

sql - 列出一台服务器中所有数据库的所有触发器

MySQL 和用户偏好的预定更新?

sql - 如何在窗口函数中使用环形数据结构

postgresql - 在 PostgreSQL WHERE 子句中,如何查找 ID 不在数组中的所有行?