gpt4 book ai didi

sql - postgresql 触发器中的 CURRENT_DATE

转载 作者:行者123 更新时间:2023-11-29 14:24:06 25 4
gpt4 key购买 nike

我在 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(); 不起作用?

最佳答案

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

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(),这是更可取的解决方案。

关于sql - postgresql 触发器中的 CURRENT_DATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8771472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com