指定一个触发器来更新时间戳字段
Specifying a triger to update timestamp field
这是关于 的跟进问题:
.
CREATE TABLE "x"."y"(
"z" timestamp NOT NULL,
"a" Timestamp NOT NULL DEFAULT z + 18 months,
);
我希望指定一个触发器,其中 a 在 z 更新后立即更新。
的内容
CREATE TRIGGER a_update
AFTER UPDATE on z
on x.y
NEW.a = NEW.z + interval '18 months'
你能帮我看看语法吗?
因为在您的场景中 a
应该 总是 是 z
之后的 18 个月,所以实际上将它存储在任何地方都没有意义。将它作为视图中的计算列会容易得多:
CREATE VIEW y_view AS
SELECT z, z + INTERVAL '18 MONTH' AS a
FROM y;
PostgreSQL 中的触发器是通过首先创建一个函数,然后将该函数附加到适当的 table 来实现的,如 documented in the Postgres manual.
manual page for CREATE TRIGGER
有这个例子,应该很容易适应你的实际姓名:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE PROCEDURE check_account_update();
实际触发函数的定义,只需要填写this的body即可; OLD
和 NEW
别名代表整行的旧值和新值:
CREATE FUNCTION my_trigger() RETURNS trigger
AS $$
NEW.foo := OLD.foo + 1;
RETURN NEW;
$$
LANGUAGE plpgsql;
还有更多注释和示例on this manual page。
这是关于 的跟进问题:
CREATE TABLE "x"."y"(
"z" timestamp NOT NULL,
"a" Timestamp NOT NULL DEFAULT z + 18 months,
);
我希望指定一个触发器,其中 a 在 z 更新后立即更新。
的内容CREATE TRIGGER a_update
AFTER UPDATE on z
on x.y
NEW.a = NEW.z + interval '18 months'
你能帮我看看语法吗?
因为在您的场景中 a
应该 总是 是 z
之后的 18 个月,所以实际上将它存储在任何地方都没有意义。将它作为视图中的计算列会容易得多:
CREATE VIEW y_view AS
SELECT z, z + INTERVAL '18 MONTH' AS a
FROM y;
PostgreSQL 中的触发器是通过首先创建一个函数,然后将该函数附加到适当的 table 来实现的,如 documented in the Postgres manual.
manual page for CREATE TRIGGER
有这个例子,应该很容易适应你的实际姓名:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE PROCEDURE check_account_update();
实际触发函数的定义,只需要填写this的body即可; OLD
和 NEW
别名代表整行的旧值和新值:
CREATE FUNCTION my_trigger() RETURNS trigger
AS $$
NEW.foo := OLD.foo + 1;
RETURN NEW;
$$
LANGUAGE plpgsql;
还有更多注释和示例on this manual page。