postgresql – 当布尔字段设置为true时,postgres更新日期字段

为了示例,请考虑一个表

create table foo (
  contents text NOT NULL,is_active boolean NOT NULL DEFAULT false,dt_active date
)

我插入一条记录:

insert into foo (contents) values ('bar')

到现在为止还挺好.后来,我现在要“激活”记录:

update foo set is_active = true

当is_active从false更改为true时,我想要做的是将dt_active设置为now().对于奖励积分,如果将​​is_active从true更改为false,将dt_active设置为null,那将是很好的,但我可以不用它.

我真的想将这个内务处理推送到数据库中,它会使客户端代码更加清晰(因为许多表(甚至表中的列元组)都可以从这种技术中受益).

我很困惑如何在触发器中拉出数据库中的当前记录(我正在使用plpgsql),以便将“then”与“now”进行比较.代码示例或代码段的指针非常感谢.

解决方法

CREATE OR REPLACE FUNCTION trg_update_foo() RETURNS TRIGGER AS
$BODY$
BEGIN
    IF OLD.is_active = false AND NEW.is_active = true THEN
        NEW.dt_active := now();
    ELSIF OLD.is_active = true AND NEW.is_active = false THEN
        NEW.dt_active := NULL;
    END IF;
    RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER trg_update_foo BEFORE UPDATE ON foo FOR EACH ROW EXECUTE PROCEDURE trg_update_foo();

应该管用.有关更多信息,请查看pl / PgSQL Triggers manual,以及额外的积分 – 整个plPgSQL文档.

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...