【问题标题】:Specifying a triger to update timestamp field指定触发器以更新时间戳字段
【发布时间】:2015-06-04 01:25:30
【问题描述】:

这是一个后续问题: old example.

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 个月,为什么不直接使用视图呢?
  • 谢谢。我不知道意见。将研究和编辑我的问题。
  • 从一些细节看我的回答

标签: sql postgresql triggers updates ddl


【解决方案1】:

由于您的场景中的a 应该总是z 之后 18 个月,因此实际上将其存储在任何地方是没有意义的。将其作为视图中的计算列会容易得多:

CREATE VIEW y_view AS 
SELECT z, z + INTERVAL '18 MONTH' AS a 
FROM   y;

【讨论】:

    【解决方案2】:

    PostgreSQL 中的触发器是通过首先创建一个函数,然后将该函数附加到适当的表中来实现的,如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即可; OLDNEW 别名代表整行的旧值和新值:

    CREATE FUNCTION my_trigger() RETURNS trigger
        AS $$
            NEW.foo := OLD.foo + 1;
            RETURN NEW;
        $$
        LANGUAGE plpgsql;
    

    还有更多注释和例子on this manual page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-05
      • 2014-09-30
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多