如果我有以下表格:
create table rar (
rar_id int(11) not null auto_increment primary key,
rar_name varchar (20));
create table data_link(
id int(11) not null auto_increment primary key,
rar_id int(11) not null,
foreign key(rar_id) references rar(rar_id));
create table consumption (
id int(11) not null,
foreign key(id) references data_link(id),
consumption int(11) not null,
total_consumption int(11) not null,
date_time datetime not null);
我希望总消费量是所有消费字段值的总和。有没有办法通过触发器实现这一目标?或者我是否需要每次读取所有值+最新值,总结它们然后更新表格?有一个更好的方法吗?
--------------------------------------------------
id | consumption | total_consumption | date_time |
==================================================|
1 | 5 | 5 | 09/09/2013 |
2 | 5 | 10 | 10/09/2013 |
3 | 7 | 17 | 11/09/2013 |
4 | 3 | 20 | 11/09/2013 |
--------------------------------------------------
只是想知道每次添加新条目时是否有更简洁的方法来获取总数?
或者这可能是糟糕的设计?有更好的东西,如:
SELECT SUM(consumption) FROM consumption WHERE date BETWEEN '2013-09-09' AND '2013-09-11'
为了获得此类信息......这样做是最好的选择吗?我看到的唯一问题是,相同的命令将被重复运行多次 - 每次数据都不会被存储,因为它将被请求检索....当你重新生成时,它可能是低效的相同的报告多次用于查看目的....相反,如果已经计算了总数,那么您只需要读取数据,而不是一次又一次地计算它......想法?
任何帮助将不胜感激......
答案 0 :(得分:1)
如果你必须有触发器 - 它应该是这样的:
DELIMITER $$
CREATE
TRIGGER `chg_consumption` BEFORE INSERT ON `consumption`
FOR EACH ROW BEGIN
SET NEW.total_consumption=(SELECT
MAX(total_consumption)+new.consumption
FROM consumption);
END;
$$
DELIMITER ;
P.S。并使total_consumption int(11) not null,
可以为空或默认为0
编辑:
从SUM(total_consumption)
改为MAX(total_consumption)
作为@calcinai建议
答案 1 :(得分:1)
如果你在total_consumption
上有一个索引,它将不会明显减慢查询速度,使嵌套选择MAX(total_consumption)
作为插入的一部分,因为最大值将被存储。
例如
INSERT INTO `consumption` (consumption, total_consumption)
VALUES (8,
consumption + (SELECT MAX(total_consumption) FROM consumption)
);
我不确定您是如何使用id
列的,但您可以轻松地将标准添加到嵌套选择中以控制它。
如果确实需要在嵌套选择中放置WHERE,请确保在所使用的字段中有一个索引,然后是total_consumption
列。例如,如果您设置... WHERE id = x
,则需要(id, total_consumption)
上的索引才能使其有效运行。