1. 需求
在 PostgreSQL 中实现类似 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 功能
2. 添加字段
首先,为表添加一个 TIMESTAMP 类型的字段(例如 crawled_time):
ALTER TABLE wechat_article ADD COLUMN crawled_time TIMESTAMPTZ;
3. 创建触发器函数
1. 定义一个触发器函数,在该条数据每次更新时将 crawled_time 设置为当前时间:
CREATE OR REPLACE FUNCTION update_crawled()
RETURNS TRIGGER AS $$
BEGIN
new.crawled_time = CLOCK_TIMESTAMP(); -- 使用实际更新时间
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
- update_crawled 为函数名称
- crawled_time 储存更新时间的字段
- CLOCK_TIMESTAMP 默认精确到微秒级别
2. 定义一个触发器函数,在该条数据的某些字段每次更新时将 crawled_time 设置为当前时间:
CREATE OR REPLACE FUNCTION update_crawled()
RETURNS TRIGGER AS $$
BEGIN
-- 检查 username 或 email 是否被修改
IF (NEW.content IS DISTINCT FROM OLD.content OR
NEW.img_li IS DISTINCT FROM OLD.img_li
) THEN
NEW.crawled_time = CLOCK_TIMESTAMP();
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
4. 创建触发器
将触发器函数绑定到表的 BEFORE UPDATE 事件:
CREATE TRIGGER trigger_update_crawled
BEFORE UPDATE ON wechat_article
FOR EACH ROW
EXECUTE FUNCTION update_crawled();
- trigger_update_crawled 为触发器名称
- wechat_article 目标表名
- update_crawled 触发器函数
设置默认值
若希望在插入时也自动填充当前时间,添加字段时指定默认值:
ALTER TABLE your_table ADD COLUMN crawled_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
5. 删除触发器(如需)
DROP TRIGGER IF EXISTS trigger_update_crawled ON wechat_article;
6. 删除触发器函数
DROP FUNCTION IF EXISTS update_crawled();