插入触发器以操作现有行的时间戳

insert trigger to manipulate timestamps of existing rows

我有一个 table 有 2 个日期列

CREATE TABLE test
(
  id serial PRIMARY KEY,
  code integer NOT NULL,
  eff_date timestamp default now(),
  exp_date timestamp default '2025-12-31'
);

我想在插入具有相同 code 的新行时更新现有行的 exp_date,旧行的 exp_date 将在前一天新行的 eff_dateeff_dateexp_date 值都不会出现在插入查询中

例如:

id code eff_date exp_date
1 12345 2021-01-31 2021-02-27
2 12345 2021-02-28 2021-03-30
3 12345 2021-03-31 2021-04-29
4 12345 2021-04-30 2021-05-30
5 12345 2021-05-31 2025-12-31

在此 table 中,我们希望在插入行 id=2 时通过检查 最新的现有行 来更新行 id=1 (最近 eff_date)并将其 exp_date 更新为新行 eff_date 前一天。

exp_date for id=1 将变为 2021-02-27 因为新行的 eff_date2021-02-28.

这可以通过插入触发器完成吗?

是的,您可以使用触发器来完成此操作。 eff_dateexp_date - 虽然在插入语句中丢失 - 仍然会在 new 记录中以默认值存在。

create or replace function test_insert_tf() returns trigger language plpgsql as 
$$
begin 
    update test 
    set exp_date = new.eff_date::date - 1 
    where code = new.code 
    and eff_date = (select max(eff_date) from test where code = new.code);
    return new;
end;
$$;

CREATE TRIGGER test_insert_t
    before INSERT
    ON test
    FOR EACH ROW
    EXECUTE PROCEDURE test_insert_tf();

不过性能不是很好。顺便说一句,eff_dateexp_datetimestamp 类型有什么具体原因吗?也许键入 date 会更相关。