teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

chousei

2019/07/30 12:01

投稿

yambejp
yambejp

スコア117912

answer CHANGED
@@ -1,4 +1,57 @@
1
1
  毎回トリガで集計するのも非効率的なので、
2
2
  idを指定して集計するようなプロシージャをつくって
3
3
  適宜呼び出してやればよいのでは?
4
- (面倒だけど効率をとるか、簡単だけど非効率をとるか)
4
+ (面倒だけど効率をとるか、簡単だけど非効率をとるか)
5
+
6
+ # 調整
7
+ ```SQL
8
+ CREATE TABLE test_journals (
9
+ company_id CHAR(43) NOT NULL,
10
+ journal_id INT NOT NULL,
11
+ account_id CHAR(6),
12
+ amount BIGINT,
13
+ PRIMARY KEY (company_id, journal_id, account_id)
14
+ ) DEFAULT CHARSET=utf8;
15
+
16
+ CREATE TABLE test_trial_balances (
17
+ company_id CHAR(43) NOT NULL,
18
+ account_id CHAR(6),
19
+ total_amount BIGINT,
20
+ PRIMARY KEY (company_id, account_id)
21
+ ) DEFAULT CHARSET=utf8;
22
+
23
+ /* ここまで提示の通り */
24
+ ```
25
+ 以下ちょっと手抜き(特にidを指定せずに全更新)
26
+ プロシージャ作成
27
+ ```SQL
28
+ drop procedure if exists mod_balances;
29
+ delimiter //
30
+ create procedure mod_balances()
31
+ begin
32
+ insert into test_trial_balances
33
+ select company_id,account_id,sum(amount) from test_journals
34
+ group by company_id,account_id
35
+ on duplicate key update total_amount=values(total_amount);
36
+ end
37
+ //
38
+ delimiter ;
39
+ ```
40
+ test_trial_balancesにダミーデータを入れておく
41
+ ```SQL
42
+ INSERT IGNORE INTO test_trial_balances VALUES
43
+ ('X','aaa',150),
44
+ ('X','bbb',100);
45
+ ```
46
+
47
+ test_journalsにデータ投入して、その後更新プロシージャを走らせる
48
+ ```SQL
49
+ INSERT IGNORE INTO test_journals VALUES
50
+ ('X','1','aaa',100),
51
+ ('X','2','aaa',200),
52
+ ('X','3','aaa',-150),
53
+ ('X','1','bbb',300),
54
+ ('X','2','bbb',400),
55
+ ('Y','1','aaa',500);
56
+ call mod_balances();
57
+ ```