0

我有一张有 2 个日期列的表格

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

我想在插入exp_date具有相同内容的新行时更新现有行的,旧行的 将在新行的前一天。或值都不会在插入查询中codeexp_dateeff_dateeff_dateexp_date

例如:

ID 代码 eff_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

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

exp_dateforid=1将成为2021-02-27因为eff_date新的 row is 2021-02-28

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

4

1 回答 1

1

是的,您可以使用触发器来执行此操作。eff_date并且exp_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_date类型timestamp?也许类型date会更相关。

于 2021-10-21T06:10:15.737 回答