gpt4 book ai didi

postgresql - 如何创建触发器来更新另一个表中的列?

转载 作者:行者123 更新时间:2023-11-29 11:29:24 25 4
gpt4 key购买 nike

因此,我正在为我的应用程序服务器向数据库添加最后更新时间。这个想法是,它将记录更新应用于我们的一次旅行的时间,然后该应用程序可以发送获取请求以确定它是否获得了所有正确的最新信息。

我已将该列添加到我们的表中,并为其提供服务,最后设法让触发器在每次对其行程表中的行程进行更改时更新该列。我现在的问题来自于这样一个事实,即与旅行有关的信息也存储在许多其他表格中(例如,有构成旅行的路线表和用户可以在旅行等...),如果任何数据发生变化,那么旅行的更新时间也需要改变。我终究无法弄清楚如何设置触发器,以便在我更改某些路线信息时,路线所属行程的最后更新时间将在其表格中更新。

这是我现在的触发代码:当行程行更新时,它会更新行程表的最后更新列。

CREATE OR REPLACE FUNCTION record_update_time() RETURNS TRIGGER AS
$$
BEGIN
NEW.last_updated=now();
RETURN NEW;
END;
$$
LANGUAGE PLPGSQL;

CREATE TRIGGER update_entry_on_entry_change
BEFORE UPDATE ON mydatabase.trip FOR EACH ROW
EXECUTE PROCEDURE record_update_time();

--I used the next two queries just to test that the trigger works. It
--probably doesn't make a difference to you but I'll keep it here for reference
UPDATE mydatabase.trip
SET title='Sample New Title'
WHERE id = 2;
SELECT *
FROM mydatabase.trip
WHERE mydatabase.trip.id < 5;

现在我需要它在引用带有外键的行程行的行更新时进行更新。比我更熟悉 SQL 触发器的人有什么想法吗?

最佳答案

“mydatabase” 对于 schema 来说是一个非常不幸的名字。

触发函数可能如下所示:

CREATE OR REPLACE FUNCTION trg_upaft_upd_trip()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
UPDATE mydatabase.trip t -- "mydatabase" = schema name (?!)
SET last_updated = now()
WHERE t.id = NEW.trip_id -- guessing column names

RETURN NULL; -- calling this AFTER UPDATE
END
$func$;

并且需要在每个相关表的触发器中使用(不是 trip 本身):

CREATE TRIGGER upaft_upd_trip
AFTER UPDATE ON mydatabase.trip_detail
FOR EACH ROW EXECUTE PROCEDURE trg_upaft_upd_trip();

您还需要在所有子表上覆盖INSERTDELETE(可能还有COPY)...

这种方法有很多潜在的失败点。作为替代方案,考虑一个查询或 View ,该查询或 View 动态地从子表计算最新的 last_updated。如果您经常更新,这可能是更好的方法。
如果您很少UPDATE 并且经常SELECT,您的第一种方法可能会奏效。

关于postgresql - 如何创建触发器来更新另一个表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com