MySQL BEFORE UPDATE触发器按id+day条件计算amount列总和实现咨询
MySQL BEFORE UPDATE触发器实现方案
参考表结构
| id | day | variable | amount |
|---|---|---|---|
| 1 | Monday | Total | null |
| 1 | Monday | null | 1 |
| 1 | Monday | null | 2 |
| 1 | Monday | null | 3 |
| 1 | Tuesday | Total | null |
| 1 | Tuesday | null | 1 |
| 1 | Tuesday | null | 2 |
| 1 | Tuesday | null | 3 |
| 2 | Monday | Total | null |
| 2 | Monday | null | 1 |
| 2 | Monday | null | 2 |
| 2 | Monday | null | 3 |
| 2 | Tuesday | Total | null |
| 2 | Tuesday | null | 1 |
| 2 | Tuesday | null | 2 |
| 2 | Tuesday | null | 3 |
核心实现逻辑
- 仅捕获
amount字段发生变更的更新操作,减少无意义计算 - 取当前被更新行的
id和day作为唯一分组条件,仅计算该分组的合计值,不会影响其他id或其他日期的合计结果 - 跳过
variable='Total'行本身的更新逻辑,避免循环触发 - 计算完成后仅更新同分组下
variable='Total'行的amount值
触发器代码
DELIMITER // CREATE TRIGGER update_total_amount BEFORE UPDATE ON your_table_name FOR EACH ROW BEGIN -- 仅amount字段变更时触发计算 IF OLD.amount <> NEW.amount THEN -- 跳过Total行的更新,避免循环触发 IF OLD.variable <> 'Total' THEN -- 计算当前id+day分组下所有非Total行的amount总和 UPDATE your_table_name SET amount = ( SELECT SUM(amount) FROM (SELECT * FROM your_table_name) AS temp WHERE id = OLD.id AND day = OLD.day AND variable IS NULL ) WHERE id = OLD.id AND day = OLD.day AND variable = 'Total'; END IF; END IF; END // DELIMITER ;
注意将代码中的your_table_name替换为实际使用的表名
内容的提问来源于stack exchange,提问作者user16627043
相关产品推荐
相关产品推荐

