这是我的样本表。
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语句时:
UPDATE employee_test SET monthDownload = 'oct12'
WHERE idTst = 1;
所有changeDate行都会使用当前日期进行更新。 有没有办法只有一行更改记录,以更新当前日期。
答案 0 :(得分:2)
如果您使用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;