创建SQL触发器更新关联表时出现ON附近语法错误的咨询
问题原因
你当前使用的是SQL Server的触发器编写语法,而从代码中使用的public schema可以判断你运行的是PostgreSQL数据库,二者触发器语法存在差异,因此触发syntax error at or near "ON"报错。
正确实现方案
增量更新(推荐)
仅更新本次插入涉及的游戏title的计数,性能更高,不会每次插入都全表扫描game_info:
- 先给game_count表的title字段添加唯一约束,支持后续更新时的冲突判断:
ALTER TABLE game_count ADD CONSTRAINT uk_game_count_title UNIQUE (title);
- 创建触发器函数:
CREATE OR REPLACE FUNCTION update_game_count() RETURNS TRIGGER AS $$ BEGIN -- 对新增的title执行 upsert:存在则更新计数,不存在则插入 INSERT INTO game_count (title, count) SELECT NEW.title, 1 ON CONFLICT (title) DO UPDATE SET count = game_count.count + 1; RETURN NEW; END; $$ LANGUAGE plpgsql;
- 绑定触发器到game_info表的插入事件:
CREATE TRIGGER my_trigger AFTER INSERT ON game_info FOR EACH ROW EXECUTE FUNCTION update_game_count();
全量重算逻辑(不推荐)
和你原有逻辑对齐,每次插入后清空game_count并重算所有数据,仅适合数据量极小的场景使用:
CREATE OR REPLACE FUNCTION rebuild_game_count() RETURNS TRIGGER AS $$ BEGIN -- 先清空原有统计数据避免重复插入 TRUNCATE TABLE game_count; -- 全量重算插入 INSERT INTO game_count(title,count) SELECT title, count(*) FROM public.game_info GROUP BY title ORDER BY count DESC; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER my_trigger AFTER INSERT ON game_info FOR EACH STATEMENT EXECUTE FUNCTION rebuild_game_count();
注意事项
- 首次使用触发器前,建议先执行你给出的game_count全量初始化插入语句,保证历史数据的计数准确,后续新增数据会由触发器自动更新
- 增量更新方案性能远高于全量重算方案,生产环境优先选择增量逻辑
内容的提问来源于stack exchange,提问作者ChickenRex
相关产品推荐
相关产品推荐

