如何在PostgreSQL中创建计算阅读时长的触发器函数
将JS阅读时长计算逻辑转为PostgreSQL触发器函数
你需要把JavaScript中的阅读时长计算逻辑迁移到PostgreSQL触发器中,实现插入/更新posts表时自动计算并赋值minutes字段。以下是完整的实现方案:
原JavaScript逻辑回顾
export function minutesToRead(data: string): string { const wordCount = data.trim().split(/\s+/g).length; return (wordCount / 100 + 1).toFixed(0); }
PostgreSQL触发器函数实现
1. 创建计算触发器函数
CREATE OR REPLACE FUNCTION public.insert_minutes() RETURNS trigger AS $$ DECLARE word_count INTEGER; BEGIN -- 处理content为空或空白的边界情况 IF NEW.content IS NULL OR TRIM(NEW.content) = '' THEN word_count := 0; ELSE -- 按任意空白字符分割内容,统计单词数量 word_count := array_length(regexp_split_to_array(TRIM(NEW.content), '\s+'), 1); END IF; -- 复刻JS的计算逻辑:单词数/100 +1 后四舍五入取整 NEW.minutes := ROUND((word_count::numeric / 100) + 1)::INTEGER; RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER;
2. 创建触发器(合并INSERT/UPDATE处理)
不需要创建两个重复名称的触发器,用一个触发器同时处理插入和更新操作:
CREATE TRIGGER posts_set_minutes BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE insert_minutes();
关键说明
- 边界处理:增加了对
content为空或纯空白字符串的判断,避免计算报错 - 逻辑对齐:使用
regexp_split_to_array模拟JS的split(/\s+/g),ROUND函数对应toFixed(0)的四舍五入行为 - 触发器优化:合并INSERT和UPDATE触发逻辑,避免重复创建同名触发器
- 权限注意:
SECURITY DEFINER会以函数所有者权限执行,确保所有者拥有posts表的读写权限
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

