在PostgreSQL数据库中,实现时间戳的自动更新是业务开发中非常常见的需求,通常我们需要在表中记录数据的创建时间和最后修改时间,避免手动赋值带来的遗漏和错误。通过创建存储过程配合CREATE TRIGGER触发器,可以很方便地实现这一功能,让数据库自动完成时间戳的维护工作。

实现思路说明
核心逻辑分为两步,首先创建一个存储过程,该存储过程的作用是给目标表的指定时间戳字段赋值,如果是创建时间则赋当前时间,如果是更新时间则赋当前时间。然后创建一个触发器,当表发生插入或者更新操作时,自动调用这个存储过程完成时间戳的更新。
创建存储过程
我们首先创建一个通用的存储过程,它可以同时处理创建时间和更新时间的自动赋值,通过判断触发事件类型来决定给哪个字段赋值。
-- 创建自动更新时间戳的存储过程
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
-- 如果是插入操作,设置创建时间和更新时间为当前时间
IF TG_OP = 'INSERT' THEN
NEW.create_time = NOW();
NEW.update_time = NOW();
-- 如果是更新操作,只更新更新时间
ELSIF TG_OP = 'UPDATE' THEN
NEW.update_time = NOW();
END IF;
-- 返回修改后的新行
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
这个存储过程的逻辑很清晰,首先判断触发操作是插入还是更新,如果是插入操作,就把create_time和update_time都设置为当前时间,如果是更新操作,就只更新update_time为当前时间,最后返回修改后的新行,保证赋值生效。
创建测试表
为了验证功能,我们先创建一个测试表,表中包含id、content、create_time、update_time四个字段,其中create_time和update_time就是我们需要自动维护的时间戳字段。
-- 创建测试表
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
content VARCHAR(255),
create_time TIMESTAMP,
update_time TIMESTAMP
);
创建并绑定触发器
接下来使用CREATE TRIGGER语句创建触发器,将触发器和刚才创建的存储过程绑定,同时指定触发时机和触发事件。
-- 创建触发器,在插入和更新操作时触发 CREATE TRIGGER trigger_update_timestamp BEFORE INSERT OR UPDATE ON test_table FOR EACH ROW EXECUTE FUNCTION update_timestamp();
这里的触发器命名为trigger_update_timestamp,触发时机是BEFORE INSERT OR UPDATE,也就是在插入或者更新操作执行之前触发,触发范围是FOR EACH ROW,即每一行数据操作都会触发,最后调用我们之前创建的update_timestamp存储过程。
功能验证
我们插入一条测试数据,然后查看时间戳字段的值,再更新这条数据,观察更新时间的变化。
-- 插入测试数据
INSERT INTO test_table (content) VALUES ('第一条测试内容');
-- 查询插入后的数据
SELECT * FROM test_table;
-- 更新测试数据
UPDATE test_table SET content = '更新后的测试内容' WHERE id = 1;
-- 再次查询数据,观察时间戳变化
SELECT * FROM test_table;
第一次查询时,create_time和update_time的值相同,都是插入数据的时间。第二次查询时,create_time保持不变,update_time变成了更新操作执行的时间,说明自动更新时间戳的功能已经生效。
注意事项
- 存储过程的返回类型必须是
RETURNS TRIGGER,否则无法和触发器绑定。 - 触发器中的
EXECUTE FUNCTION是PostgreSQL 11及以上版本的语法,如果是更老的版本需要使用EXECUTE PROCEDURE。 - 如果表中不需要创建时间字段,可以修改存储过程,去掉插入时给
create_time赋值的逻辑。 - 触发器的触发时机选择
BEFORE是为了在数据写入之前完成时间戳赋值,避免写入无效的时间值。
PostgreSQL自动更新时间戳CREATE_TRIGGER存储过程修改时间:2026-06-30 09:03:35