Mysql触发没有错误消息但代码不起作用
Posted
技术标签:
【中文标题】Mysql触发没有错误消息但代码不起作用【英文标题】:Mysql trigger no error message but code not working 【发布时间】:2014-11-21 17:04:22 【问题描述】:我在 phpMyAdmin 中编写了这个触发器
BEGIN
DECLARE start DATETIME;
DECLARE now DATETIME;
DECLARE date DATETIME;
SELECT `starting` INTO start FROM events WHERE events.id = NEW.event_id;
SET now = NOW();
SET date = CURDATE();
IF start > now THEN
IF DATE(start) = date THEN
SET @hours = HOUR(start - now);
IF @hours <= 1 THEN
SET @text = 'in less than an hour';
ELSE
SET @text = CONCAT('in about ', @hours, ' hours');
END IF;
INSERT INTO notifications (user_id, subject, action_id, data, seen, activates)
VALUES (NEW.user_id, NEW.event_id, 2, CONCAT('"period":"', @text, '"'), 0, now);
ELSE
INSERT INTO notifications (user_id, subject, action_id, data, seen, activates)
VALUES
(NEW.user_id, NEW.event_id, 2, '"period":"tomorrow"', 0, DATE(start - INTERVAL 1 DAY)),
(NEW.user_id, NEW.event_id, 2, '"period":"in one hour"', 0, start - INTERVAL 1 HOUR);
END IF;
END IF;
END
它的目的是在用户提交他将要参加活动时创建有关开始活动的通知。如果事件不是今天,触发器会起作用,但如果事件是今天,我会收到此消息
列数据不能为NULL
列数据在表notifications
中。如果事件设置为今天开始,我得到的列数据不能为 NULL,如果事件在未来发生,比如明天,我会得到准确的消息。
非常感谢任何帮助!
【问题讨论】:
如果@text 为null,则@hours 必须为null - sql null 具有传染性,这可能意味着start
在您实际设置start
的第一个查询中为null,其中@987654325 @ 是基于的。
@MarcB 我刚刚检查过,通过将INSERT
语句中的@text
分别替换为start
和now
,我确定start
等于2014-11-21 20:00:00
和@987654332 @ 在测试时等于“2014-11-21 19:29:31”。出于某种原因,HOUR(start - now)
返回 NULL,我不明白..
我不确定start - now
的数据类型应该是什么,但我对文档的快速阅读表明可能是一些数字类型。在任何情况下,它都不应该是DATE
、TIME
或DATETIME
。 HOUR()
函数似乎不太可能对此有用。
不应该是= HOUR(start) - HOUR(now)
吗?
datetime-datetime
将返回某种浮点数。 hour(float) 应该只返回1
。在应用 hour() 之前将减法的结果存储在某处。
【参考方案1】:
这段代码有问题
HOUR(start - now)
我换成
HOUR(TIMEDIFF(start - now))
现在一切正常。
我必须通过Marc B 的help 解决问题,为此我感谢他和所有评论的人!
【讨论】:
以上是关于Mysql触发没有错误消息但代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS Passport按路由配置,作为中间件添加并且没有错误但它不起作用/触发