【问题标题】:CURRENT_DATE in postgresql triggerspostgresql 触发器中的 CURRENT_DATE
【发布时间】:2012-01-07 17:11:50
【问题描述】:

我之前在 postgres 中插入了触发器

CREATE OR REPLACE FUNCTION add_requestdate() RETURNS TRIGGER AS $$
DECLARE

BEGIN

    new.requestdate := now();

    RETURN NEW;
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addrequestdate
BEFORE INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE add_requestdate ();

但它不起作用!我有有效的解决方案...

CREATE OR REPLACE FUNCTION add_requestdate() RETURNS TRIGGER AS $$
DECLARE

BEGIN

    UPDATE requests SET requestdate=now() WHERE id=NEW.id;

    RETURN NEW;
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addrequestdate
BEFORE INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE add_requestdate ();

我只有一个问题。为什么new.requestdate := now(); 不起作用?

【问题讨论】:

  • 什么错误?在我的 PostgreSQL 9.0 版本中,第一个示例没有问题。你可以把表定义,以及你运行的SQL命令吗?而你的 PostgreSQL 版本是?
  • 请定义“不起作用!”。第二个触发器只有在requests.id 不是唯一的情况下才有效 - 在具有相同id 的其他行上。 id 是唯一的吗?是否涉及其他其他触发器?

标签: sql postgresql triggers


【解决方案1】:

它工作 - 可能你有一些其他依赖 - 奇怪的是,你的可行解决方案无法工作,因为前触发器在表中看不到元组,如果你使用后触发器,那么你开始递归..

postgres=# create table x(a int, b date, c timestamp);
CREATE TABLE
postgres=# create function fxx()
postgres-# returns trigger as $$
postgres$# begin
postgres$#   new.b := now();
postgres$#   new.c := now();
postgres$#   return new;
postgres$# end;
postgres$# $$ language plpgsql;
CREATE FUNCTION
postgres=# create trigger xxxx before insert on x for each row execute procedure fxx();  
CREATE TRIGGER
postgres=# insert into x(a) values(10);
INSERT 0 1
postgres=# insert into x(a) values(209);
INSERT 0 1
postgres=# select * from x;
  a  │     b      │             c              
─────┼────────────┼────────────────────────────
  10 │ 2012-01-07 │ 2012-01-07 18:36:57.665283
 209 │ 2012-01-07 │ 2012-01-07 18:37:00.853442
(2 rows)

所以,您可以使用 CURRENT_DATE now(),这是更可取的解决方案。

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2011-03-15
    • 2019-09-04
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多