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

创建产品列表统计触发器与存储过程时遇ERROR 1064语法错误

问题分析与修正方案

核心错误点

  • DATE()函数语法错误:MariaDB中DATE()必须传入时间参数(比如DATE(NOW())),直接写DATE()属于非法语法,这是触发1064报错的直接原因。
  • 存储过程冗余代码:new_day存储过程里,END IF;之后多写了一个END;,导致语法结构混乱。
  • 触发器逻辑冗余:Trig_BEFORE_ANY_update_stats里调用new_day()后再检查日期行是否存在完全没必要——new_day()本身就是用来确保对应日期行存在的。

优化后的完整代码

首先给stats表的day字段添加唯一索引,这是后续避免重复插入、实现原子操作的基础:

ALTER TABLE stats ADD UNIQUE INDEX idx_day (day);

然后修正存储过程与触发器:

-- 删除旧存储过程
DROP PROCEDURE IF EXISTS new_day;
-- 修改语句分隔符
DELIMITER $
CREATE PROCEDURE new_day()
BEGIN
    -- 用INSERT...ON DUPLICATE KEY UPDATE替代先查后插,更高效且避免并发问题
    INSERT INTO stats (day) VALUES (DATE(NOW()))
    ON DUPLICATE KEY UPDATE day = day;
END$
-- 恢复默认分隔符
DELIMITER ;

-- 删除冗余的前置更新触发器(该逻辑已被new_day覆盖)
DROP TRIGGER IF EXISTS Trig_BEFORE_ANY_update_stats;

-- 删除旧的列表创建触发器
DROP TRIGGER IF EXISTS Trig_AFTER_LIST_CREATED;
DELIMITER $
CREATE TRIGGER Trig_AFTER_LIST_CREATED
AFTER INSERT ON SAE_Liste FOR EACH ROW
BEGIN
    -- 先确保当日统计行存在,再递增计数
    CALL new_day();
    UPDATE stats SET nb_List_CREATED_per_Day = nb_List_CREATED_per_Day + 1 WHERE day = DATE(NOW());
END$
DELIMITER ;

补充说明

  1. INSERT ... ON DUPLICATE KEY UPDATE可以在一行语句内完成「存在则跳过,不存在则插入」的逻辑,比先查询后插入更高效,还能避免并发场景下的重复插入问题。
  2. 给day字段加唯一索引是上述原子操作生效的前提,确保同一日期只会存在一行统计数据。

内容的提问来源于stack exchange,提问作者Ethan COMTET

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:32:32