gpt4 book ai didi

postgresql - 如何修改触发器以更新 PostgreSQL 中的单个属性

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

这是我的示例表。

CREATE TABLE employee_test(
idTst SERIAL PRIMARY KEY,
monthDownload VARCHAR(6),
changeDate DATE);

我正在尝试创建一个函数和触发器,以便在更新 monthDownload 属性时使用当前日期更新 changeDate 属性。我拥有的功能可以解决一个问题。它更新所有记录而不是更新的记录。

 CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.monthDownload <> OLD.monthDownload THEN
UPDATE employee_test
SET changeDate = current_date
where OLD.idTst = NEW.idTst;
END IF;
RETURN NEW;
END;
$$
Language plpgsql;

触发器

Create TRIGGER dataTest
AFTER UPDATE
ON employee_test
FOR EACH ROW
EXECUTE PROCEDURE downloadMonthChange();

当我执行以下更新语句时:

UPDATE  employee_test SET  monthDownload = 'oct12'
WHERE idTst = 1;

All changeDate rows get update with a current date. Is there a way to have only a row with changed record to have a current date updated.

enter image description here

最佳答案

如果您使用before 触发器,您可以直接写入NEW

 CREATE OR REPLACE FUNCTION downloadMonthChange() 
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.monthDownload <> OLD.monthDownload THEN
NEW.changeDate = current_date;
END IF;
RETURN NEW;
END;
$$
Language plpgsql;

当您必须使用 after 触发器时,另一种选择是将主键包含在 where 子句中。看起来您正在尝试执行此操作,但您在查询中有一个虚假的 OLD。因为 where 子句只查看负责触发调用的记录,而不限制要更新的记录。

 IF NEW.monthDownload <> OLD.monthDownload THEN
UPDATE employee_test
SET changeDate = current_date
where idTst = NEW.idTst;

关于postgresql - 如何修改触发器以更新 PostgreSQL 中的单个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41540901/

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