不确定是否存在此类功能,但我很好奇,如果我有以下数据库,如下所示,是否可以更新,以便 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
感谢您的帮助/建议!
答案 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;