postgresql - 在函数中调用 now()

标签 postgresql timestamp

我们的 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/

相关文章:

python、dpkt 和时间戳

c++ - 如何在 Linux 和 Windows 上获取时间戳字符串

postgresql - 选择查询,用于从内部查询的记录中选择列。其中内部查询和外部查询具有不同的列

python - 将 SQLAlchemy 继承关系重新映射到不同的 postgres 模式

mysql - 修改 TIMESTAMP MySQL 以用作主键

php - 如何在php mysql中使用unix时间获取今天记录

java - Playframework 在数据库中插入错误的日期

postgresql - 如何获取每组行的非空列的名称?

postgresql - Golang 为 "CREATE TABLE"准备语句

java - 如何在 Spring 应用程序中构建层和职责?