当布尔字段设置为true时,postgres更新日期字段
-
05-07-2019 - |
题
为了举例,请考虑一个表
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
更改为 fals
e,dt_active设置为null,那将是很好的,但我可以没有它
我真的想将这个内务处理推送到数据库中,它会使客户端代码更加清晰(因为许多表(甚至表中的列元组)都可以从这种技术中受益)。
我很难过如何在触发器中拉出数据库中的当前记录(我正在使用plpgsql),以便比较“then”和“then”。与“现在”。代码示例或代码片段的指针非常受欢迎。
解决方案
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();
其他提示
在plpgsql触发器过程中,您可以访问为您创建的一些名为 NEW
和 OLD
的特殊记录类型变量。
在 UPDATE
或 INSERT
触发器中, NEW
将代表新数据库行的记录。
在 UPDATE
或 DELETE
触发器中, OLD
将表示原始数据库行的值。
在其他语句环境中,这些记录变量将是 NULL
。
因此,您似乎需要创建一个 INSERT OR UPDATE
触发器,该触发器查看 OLD.is_active
和 NEW.is_active
这是文档页面 - http://www.postgresql。 org / docs / 8.1 / interactive / plpgsql-trigger.html 此页面包含使用 NEW
和 OLD
您是否尝试过手册?
每个触发器功能都有一些自动变量。在更新触发器的情况下,可通过 OLD
访问旧行值,并通过 NEW
您只需通过 OLD.is_active
检查OLD的列值。您可以更改要放入数据库的值,如 NEW.dt_active:= now();
希望这一切。
CREATE FUNCTION actrigger() RETURNS TRIGGER AS $ BEGIN
IF TG_OP='UPDATE' THEN
IF NEW.is_active THEN
IF NOT OLD.is_active THEN
NEW.dt_active := current_date;
END IF;
ELSIF NEW.dt_active IS NOT NULL
NEW.dt_active := NULL;
END IF;
END IF;
RETURN NEW;
END; $ LANGUAGE plpgsql;
CREATE TRIGGER foobefore BEFORE UPDATE ON foo FORR EACH ROW
EXECUTE PROCEDURE actrigger();
你也可以照顾 INSERT
,除非它不应该引用 OLD
,否则它会非常相似。