对于一个包含产品列表的项目,我正在尝试进行一些统计,但是我正在创建的 Tigrer 在编译级别上存在语法错误(执行前没有错误)。
在我的统计表中,有一个日期类型:DATE,其他为 INT DEFAULT 0,我的触发器应在创建列表时增加统计表。
为了确保存在具有 DATE 的行,我在 UPDATE() 之前有一个触发器和一个用于区分所有内容的过程。但它们实际上都没有使用或不使用分隔符,并且以不同的方式来编写正文。
DROP PROCEDURE IF EXISTS new_day;
Delimiter $
CREATE PROCEDURE new_day()
BEGIN
-- seems that the error come from the WHERE day = DATE( "here" )) is...
IF (SELECT day FROM stats WHERE day = DATE()) is null THEN
INSERT INTO stats (day) VALUES (DATE());
END IF;
END;
END$
Delimiter ;
DROP TRIGGER IF EXISTS Trig_BEFORE_ANY_update_stats;
Delimiter $
CREATE TRIGGER Trig_BEFORE_ANY_update_stats
BEFORE UPDATE ON stats FOR EACH ROW
BEGIN
call new_day() ;
IF (SELECT day from stats where day=DATE()) is null THEN
SIGNAL SQLSTATE VALUE '45000'
SET MESSAGE_TEXT = "There is no tomorrow, die()";
END IF;
END$
Delimiter ;
DROP TRIGGER IF EXISTS Trig_AFTER_LIST_CREATED;
Delimiter $
CREATE TRIGGER Trig_AFTER_LIST_CREATED
AFTER INSERT ON SAE_Liste FOR EACH ROW
BEGIN
UPDATE stats SET nb_List_CREATED_per_Day = nb_List_CREATED_per_Day + 1 WHERE day = DATE();
END$
Delimiter ;
我发现一切都有效,但事实并非如此,相反我得到了:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) is null THEN INSERT INTO stats (day) VALUES (DATE(NOW())); END...' at line 3
多亏了人们的评论,问题不再存在了。表不能是调用触发器而触发器再调用表的东西。
使用
INSERT INTO stats (
day,
nb_List_CREATED_per_Day) VALUES (CURRENT_DATE, 1) ON DUPLICATE KEY UPDATE
nb_List_CREATED_per_Day=
nb_List_CREATED_per_Day + 1;
和变体后,一切都有效。
谢谢大家。
创建触发器 Trig_AFTER_LIST_DELETE 在 SAE_Liste 上删除每行开始后 插入统计数据 (
day
, nb_List_DELETE_per_Day
) 值 (CURRENT_DATE, 1)
重复密钥更新
nb_List_DELETE_per_Day
= nb_List_DELETE_per_Day
+ 1;
结束 $ 分隔符;