gpt4 book ai didi

postgresql - 在函数中调用 now()

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

我们的一个 Postgres 表,称为 rep_event,有一个时间戳列,指示插入每一行的时间。但是所有行的时间戳值均为 2000-01-01 00:00:00,因此设置不正确。

有一个函数可以将行插入到表中,它是唯一将行插入到该表中的代码——没有其他代码可以插入到该表中。 (也没有任何代码更新该表中的行。)这是函数的定义:

CREATE FUNCTION handle_event() RETURNS "trigger"
AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO rep_event SELECT 'D', TG_RELNAME, OLD.object_id, now();
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO rep_event SELECT 'U', TG_RELNAME, NEW.object_id, now();
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO rep_event SELECT 'I', TG_RELNAME, NEW.object_id, now();
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

这是表定义:

CREATE TABLE rep_event
(
operation character(1) NOT NULL,
table_name text NOT NULL,
object_id bigint NOT NULL,
time_stamp timestamp without time zone NOT NULL
)

如您所见,调用 now() 函数以获取当前时间。在数据库上执行“select now()”会返回正确的时间,那么从函数内部调用 now() 是否存在问题?

最佳答案

一个更简单的解决方案是修改您的表定义,让 NOW() 成为默认值:

CREATE TABLE rep_event (
operation character(1) NOT NULL,
table_name text NOT NULL,
object_id bigint NOT NULL,
time_stamp timestamp without time zone NOT NULL DEFAULT NOW()
);

然后您可以摆脱触发器中的 now() 调用。

另请注意,我强烈建议在您的函数中包含列排序...IOW;

INSERT INTO rep_event (operation,table_name,object_id,time_stamp) SELECT ...

这样,如果您添加新列或进行其他更改表内部顺序的表更改,您的函数就不会突然中断。

关于postgresql - 在函数中调用 now(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6618189/

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