hengdin

导航

 

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();
posted on 2025-03-28 17:07  hengdin  阅读(48)  评论(0)    收藏  举报