You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建SQL触发器更新关联表时出现ON附近语法错误的咨询

问题原因

你当前使用的是SQL Server的触发器编写语法,而从代码中使用的public schema可以判断你运行的是PostgreSQL数据库,二者触发器语法存在差异,因此触发syntax error at or near "ON"报错。

正确实现方案

增量更新(推荐)

仅更新本次插入涉及的游戏title的计数,性能更高,不会每次插入都全表扫描game_info:

  1. 先给game_count表的title字段添加唯一约束,支持后续更新时的冲突判断:
ALTER TABLE game_count ADD CONSTRAINT uk_game_count_title UNIQUE (title);
  1. 创建触发器函数:
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;
  1. 绑定触发器到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:03