PostgreSQL insert触发器实现articles插入时自动关联所有users的方法
实现方案
该需求完全可以通过PostgreSQL触发器实现,你原有思路正确,只需要修正语法和优化写法即可。
原有代码存在的问题
- 循环中取值错误:遍历users表得到的记录存在
temprow变量中,用户ID需要通过temprow.id获取,不能直接写users.id - 关联表字段命名不规范:
articles_users关联表的外键字段通常命名为article_id、user_id,不能使用带点的表名前缀作为字段名 - 缺少必要的语句结束分号
- 逐行循环插入性能差:当用户量较大时循环插入效率很低,推荐使用
INSERT ... SELECT批量插入,完全不需要循环
最终可运行代码
首先创建触发器函数:
create function public.connect_articles_to_users() returns trigger as $$ begin -- 批量插入所有用户和新文章的关联关系,不需要循环 insert into articles_users (article_id, user_id) select NEW.id, id from users; return NEW; end; $$ language plpgsql security definer;
然后创建触发器:
create trigger on_article_created after insert on articles for each row execute function public.connect_articles_to_users();
注意事项
- 请确保
articles_users表的article_id字段关联articles.id,user_id字段关联users.id,如果你的关联表字段名和示例不同,需要对应修改INSERT语句里的字段名 - 如果
articles_users表有自增主键或者其他非空字段,请确保INSERT语句里补充对应字段的赋值,或者给对应字段设置默认值 - 如果不需要给触发器赋予超级用户权限,可以去掉
security definer配置,避免权限溢出风险
内容的提问来源于stack exchange,提问作者P4nd4b0b3r1n0
相关产品推荐
相关产品推荐

