插入触发器以操作现有行的时间戳
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_date
。 eff_date
或 exp_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_date
是 2021-02-28
.
这可以通过插入触发器完成吗?
是的,您可以使用触发器来完成此操作。 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_date
和 exp_date
是 timestamp
类型有什么具体原因吗?也许键入 date
会更相关。
我有一个 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_date
。 eff_date
或 exp_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_date
是 2021-02-28
.
这可以通过插入触发器完成吗?
是的,您可以使用触发器来完成此操作。 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_date
和 exp_date
是 timestamp
类型有什么具体原因吗?也许键入 date
会更相关。