首页 > 解决方案 > 使用计算值或触发器来更新同一表中不同行的数据的行?

问题描述

2019-08-15我希望为for 进行插入mainKey = 1,如果总数大于200on2019-08-14我想将最后一列的差异保存在为2019-08-15. total是一个可以保持不变或增加的值。

+------------+---------+-------+--------------------------+
| date       | mainKey | total | differenceSinceYesterday |
+------------+---------+-------+--------------------------+
| 2019-08-14 |       1 |   200 |                        0 |
| 2019-08-14 |       2 |   500 |                        0 |
+------------+---------+-------+--------------------------+

datemainKey一起唯一标识该行,因此特定行mainKey每天只能插入一次。

+--------------------------+---------+------+-----+---------+-------+
| Field                    | Type    | Null | Key | Default | Extra |
+--------------------------+---------+------+-----+---------+-------+
| date                     | date    | NO   | PRI | NULL    |       |
| mainKey                  | int(11) | NO   | PRI | NULL    |       |
| total                    | int(11) | NO   |     | NULL    |       |
| differenceSinceYesterday | int(11) | NO   |     | NULL    |       |
+--------------------------+---------+------+-----+---------+-------+

我查看了触发器,但如果在更新后运行它会变得递归,因为它是同一个表。或者我应该将逻辑转移到首先插入的外部脚本并运行另一个SELECT以查找具有特定内容的 1 天旧行mainKey并更新今天的行?

标签: mysqldatabase

解决方案


您可以使用触发器实现您想要的BEFORE INSERT,检查total前一天的 >= 200 的值,如果存在,则将该differenceSinceYesterday值设置为今天和昨天总数之间的差异:

DELIMITER //
CREATE TRIGGER updateDifference
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  DECLARE yesterday INT;
  SELECT total INTO yesterday FROM table1 WHERE date = NEW.date - INTERVAL 1 DAY AND mainKey = NEW.mainKey;
  IF yesterday >= 200 THEN
     SET NEW.differenceSinceYesterday = NEW.total - yesterday;
  END IF;
END;
DELIMITER ;
INSERT INTO table1 (date, mainKey, total)
VALUES ('2019-08-15', 1, 400), ('2019-08-16', 1, 300);
SELECT * FROM table1

输出:

date                mainKey total   differenceSinceYesterday
2019-08-14 00:00:00 1       200     0
2019-08-14 00:00:00 2       500     0
2019-08-15 00:00:00 1       400     200
2019-08-16 00:00:00 1       300     -100

dbfiddle 上的演示


推荐阅读