【问题标题】:insert trigger to manipulate timestamps of existing rows插入触发器来操作现有行的时间戳
【发布时间】:2021-12-07 20:37:47
【问题描述】:

我有一个包含 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_date 早一天. eff_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

在此表中,当插入行id=2 时,我们希望通过检查最新的现有行(最近的eff_date)并更新它的@987654332 来更新id=1 的行@ 到新行的eff_date 前一天。

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

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

【问题讨论】:

    标签: sql postgresql triggers postgres-10 postgresql-triggers


    【解决方案1】:

    是的,您可以使用触发器来执行此操作。 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 会更相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多