通过“汇总”类似项目来更新MySQL DB

时间:2011-11-23 21:40:44

标签: mysql

不确定是否存在此类功能,但我很好奇,如果我有以下数据库,如下所示,是否可以更新,以便 first_name last_name 匹配所有扣除付款列都会相加,因此会形成一条线。我知道可以编写一个查询来获取这些信息,但我需要这个查询结果才能真正成为数据库。 (即清理多余的额外线条可以说话)。

即。

first_name | last_name | deduction | pay
skywalker  | luke      | 100       | 200 
vader      | darth     |  50       | 100 
skywalker  | luke      | 400       | 500

变为

first_name | last_name | deduction | pay
skywalker  | luke      | 500       | 700 
vader      | darth     |  50       | 100 

感谢您的帮助/建议!

3 个答案:

答案 0 :(得分:2)

答案1

创建触发器和另一个表

您可以创建一个名为star_wars的表,另一个名为star_wars_roll_up。然后是star_wars上的一个触发器,它将数据聚合到star_wars_roll_up。您写入star_wars并从star_wars_roll_up读取。可以随时从star_wars中删除任何内容。

create table star_wars (name varchar(100), deduction int, pay int);
create table star_wars_roll_up (name varchar(100), deduction int, pay int, primary key (name));
delimiter //
create trigger roll_up before insert on star_wars for each row begin insert into star_wars_roll_up values (new.name, new.deduction, new.pay) on duplicate key update deduction = deduction + new.deduction, pay = pay + new.pay;
end //
delimiter ;

insert into star_wars values ('luke', 100, 100);
insert into star_wars values ('luke', 100, 100);
insert into star_wars values ('luke', 100, 100);
select * from star_wars; select * from star_wars_roll_up;

答案 1 :(得分:0)

回答2。

您可以执行视图,然后定期删除额外数据(例如每晚)

create table star_wars_new as select * from star_wars_view;
drop table star_wars;
rename table star_wars_new to star_wars;

答案 2 :(得分:0)

如果你只想做一次,你可以做到

CREATE TABLE new_table SELECT …;

其中SELECT为表格提取所需的新数据。然后只需重命名以替换表格。

RENAME TABLE current_table TO old_table, new_table TO current_table;