mysql - 在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
编辑:正如在评论中所发现的那样,这种方法并不完全安全,因为我们可能会失去一些行动。鉴于不允许对当前方案进行任何更改,但我们可以将数据存储在新的外部方案中,请您详细说明解决方案“一种更安全的方法是使用触发器将所有事件捕获到日志并进行分析”。
解决方案
推荐阅读
- c++ - dim() 在 Libtorch C++ 中调用未定义的张量(在 ../c10/core/UndefinedTensorImpl.cpp:24 处变暗)
- django - 如何在 Django 中显示最近查看的产品?
- java - Windows 10 Enterprise 上 IntelliJ IDEA 中的 JDK 路径
- clojure - Clojure:为什么会出现 StackOverflowError?
- html - 将开关标签与左侧对齐 - Bootstrap 4
- linux - Bash:如何在一行上匹配特定数字时为一行添加前缀
- python-2.7 - ImportError:没有名为 pathlib 的模块
- java - 在外部 iframe 中加载 Spring Webflux 应用程序
- python - 永久保留python虚拟环境
- spring - JSP 模板中的会话属性