【问题标题】:MySQL Event Insert ID from another table来自另一个表的 MySQL 事件插入 ID
【发布时间】:2015-10-06 00:31:03
【问题描述】:

我想创建一个事件,当 lend_date 列正好经过 15 天时,它将执行 INSERT 查询。

它将获取该行的 ID 和userid,并将其插入到另一个表中。

例如:

id |  userid  |    lend_date
---+----------+----------------------
1  |    1     |  2015-09-24 15:58:48
2  |    1     |  2015-09-21 08:22:48

而现在,正是2015-10-06 08:23:41。所以事件应该得到第二行的ID,即2,并插入到另一个表中。

我的事件查询应该是什么样的?

事件类型是RECURRING。但我也不确定我应该每小时还是每天执行一次。最好的建议是什么?

这比使用Task Scheduler 更好吗?

我想插入获取的ID的另一个表是notification_table,它会通知用户他/她有一个过期日期。

notification_table 看起来像这样:

id |  userid  |  notificationid  |   notificationdate   |
---+----------+------------------+----------------------+
1  |    1     |        1         |  2015-09-24 15:58:48 |
2  |    1     |        1         |  2015-09-21 08:22:48 | 

我正在查看这个查询:

INSERT INTO notification_table (id, userid, notificationid, notificationdate) 
        SELECT id, userid, 1, NOW() 
        FROM first_table
        WHERE lend_date + INTERVAL 15 DAY = NOW();

【问题讨论】:

  • 正如@Strawberry 所说,你真的需要这个吗?有什么特殊原因导致您不能只使用 where 子句进行查询以从现有表中获取数据?

标签: mysql scheduled-tasks mysql-event


【解决方案1】:

在同一个句子中看到 exactly, eventdatetime 这两个词让我感到畏缩。为什么?一方面,很难让一个datetime 值与另一个值完全匹配。另一方面,事件通常在预定时间之后运行,尤其是在繁忙的数据库服务器上。他们需要一点时间才能启动。

如果您需要来自记录超过 15 天的表中的 id 值,获取它们的最准确时间的方法是使用查询或视图。

 CREATE OR REPLACE VIEW fifteen 
     AS SELECT id
          FROM table
         WHERE `datetime` < NOW() - INTERVAL 15 DAY

当然,您可以编写一个事件来将 id 复制到新表中。通过在事件中使用此类查询,您将不得不费力确保不会多次点击相同的 id 值。

   INSERT INTO newtable (id)
        SELECT id
          FROM table
         WHERE `datetime` < NOW() - INTERVAL 15 DAY
           AND id NOT IN (SELECT id FROM newtable) 

您应该多久运行一次重复事件?这完全取决于 id 值在十五天后需要多快才能进入新表。如果您的应用程序要求它少于一分钟,那么您真的应该使用视图而不是事件。任何超过一分钟的允许延迟都会让您以该频率使用重复事件。

【讨论】:

  • 我认为问题的前提是错误的。
  • @Strawberry 你可能是对的。如果我是 OP 公司的系统架构师,我可能会反对这种设计。但是谁知道他正在处理哪些其他数据设计问题?
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 2015-02-19
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多