首页 > 解决方案 > 在mysql中创建一个报告并将其存储在一个日志文件中,使用触发器,然后分析日志

问题描述

我需要为包含在此期间更新、插入或删除的记录数的特定表创建每月或每天(以更容易为准)的报告。

该表包含一个名为 updatedate 的列和另一个名为 deleted 的列,其中值 0 表示未删除,值 1 表示已删除。最后是主键列,名为 id。

以下代码返回一段时间内删除的记录:

SELECT * FROM orders
    WHERE updateDate >='2019-01-01 00:00:00'
    AND updateDate <'2019-02-13 00:00:00' AND deleted = '1'

为了获得新创建的插入记录的报告,还应该运行哪些查询?

我想还应该以某种方式计算开始日期中存在的 id 数,然后计算结束日期中存在的 id 数,然后进行减法以获得新插入的记录数?理想情况下,我希望将这些报告放在单独的文件中

CREATE TABLE orders
(
  id INT PRIMARY KEY AUTO_INCREMENT,
  updatedate DATETIME,
  product_id INT,
  deleted INT,
  customer_id INT
);
INSERT INTO orders (updatedate, product_id, deleted, customer_id)
  VALUES
  ('2019-08-15 12:20:20', '1', '0', '123'),
  ('2019-08-15 12:20:20', '2', '0', '123'),
  ('2019-08-17 16:43:09', '4', '0', '456'),
  ('2019-08-18 09:21:43', '8', '0', '789'),
  ('2019-08-18 14:23:11', '12', '0', '123'),
  ('2019-08-21 08:34:21', '19', '0', '456');

更新记录的示例输出:(假设记录 ID 在所讨论的月份不是新的)

日期 total_updates

2009-08-15  2
2009-08-17  1
2009-08-18  2
2009-08-21  1

每月删除和创建的记录需要同一张表。这必须仅基于与上个月不同的记录 ID。

即如果id 88 在上个月的最后一天不在orders 表中,那么这是一个新插入的记录。如果 id 13 在上个月最后一天的订单表中,而在本月的最后一天不是,那么这是一条已删除的记录(也可能从删除的列与更新的列结合起来发生)

因此,此报告可能如下所示:

一月:

123 records inserted
456 records deleted 

编辑:正如在评论中所发现的那样,这种方法并不完全安全,因为我们可能会失去一些行动。鉴于不允许对当前方案进行任何更改,但我们可以将数据存储在新的外部方案中,请您详细说明解决方案“一种更安全的方法是使用触发器将所有事件捕获到日志并进行分析”。

标签: mysqllogfile

解决方案


推荐阅读