【问题标题】:MySQL Trigger on Table A, INSERT OR UPDATE table B with TIMESTAMPDIFF()使用 TIMESTAMPDIFF() 对表 A、INSERT 或更新表 B 进行 MySQL 触发器
【发布时间】:2018-10-30 14:59:51
【问题描述】:

我有 2 个表 - clients 和 client_history。

CLIENTS:
    cID | last_seen  (LAST_SEEN is updated every 2 mins by my application)

CLIENT_HISTORY :
    ID | cID | left_left | time_arrived

我正在尝试:

记录客户随时间的进出。因此,当 clients.last_seen 超过 5 分钟时,使用 cID 和 clients.last_seen 值将记录插入到 client_history。

我想要类似的东西:

 BEGIN
  IF (-- something here is true)
  THEN
    INSERT INTO client_history
    SET
      cID=old.cID,
      last_seen=old.last_seen;
  ELSEIF (-- something here is true)
  THEN
    INSERT INTO client_history
    SET
      time_arrived=old.last_seen
  END IF;
END

我一直在研究使用

IF (TIMESTAMPDIFF(MINUTE,c.last_seen,NOW()) > 5) for the first IF condition.

我是触发器的新手,我不知道我的逻辑是否良好,或者是否有更简单或更好的方法来做到这一点。我想知道是否可以引入一个标志列来指示客户离开或类似的东西。

【问题讨论】:

  • 不使用newold数据时;使用触发器没有任何意义
  • 你是说我应该修改我的 SQL 吗?
  • 我建议你在谷歌上搜索一些关于触发器的好教程。它将在触发器的上下文中解释NEWOLD 关键字的含义。如果您不使用这些;为您的活动使用触发器没有任何意义
  • 谢谢,我在这方面搜索了很多东西,但找不到解决方案,这就是我在这里发帖的原因。我已将尝试使用 OLD 关键字的内容添加到 OP。
  • 如果我了解您的问题,正确的触发器不是适合您的解决方案。您想在一段时间内更新 client_history 表,而不是日期本身的变化。这种情况的正确解决方案是使用 MySQL 事件:这是一个示例:stackoverflow.com/a/12726805/460557 和文档:dev.mysql.com/doc/refman/5.7/en/event-scheduler.html

标签: mysql triggers heidisql


【解决方案1】:

这可能会帮到你。

DELIMETER $$
CREATE TRIGGER monitor
AFTER UPDATE
ON clients
FOR EACH ROW
BEGIN
IF (TIMESTAMPDIFF(MINUTE, OLD.last_seen, NEW.last_seen ) > 5)
THEN INSERT INTO client_history (cID, left_left)-- or whichever column here
SELECT NEW.cID, NEW.last_seen FROM client_history;
END IF;
END $$
DELIMETER ;

我想在逻辑中使用NEW.last_seen 值而不是NOW() 函数。

【讨论】:

  • 我也不确定在更新期间是否 cID 值也发生了变化。
  • 非常感谢 - 好主意!这正是我所需要的,我已将您的博客添加到我的每周阅读咖啡列表中:)
  • @JamesPy。很高兴知道它对你有用!也非常感谢您关注我的博客?。
猜你喜欢
  • 1970-01-01
  • 2017-10-26
  • 2019-01-04
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
相关资源
最近更新 更多