###仕様データベース 10.1.26-MariaDB
会計システムを開発しています。
明細テーブルがINSERTされるたびに集計テーブルを更新したく、以下のシナリオでトリガーの設定方法を検証しています。
####<シナリオ>
仕訳テーブルにレコードを追加したときに試算表テーブルに仕訳テーブルのデータをINSERT SELECTして更新するトリガーを設定します。
クラウドのため複数のcompanyが存在しており、それを識別するため仕訳はcompany_id(会社ID)、account_id(科目ID)ごとに集計され試算表テーブルに反映されます。
####<構築したテストテーブル>
-- 仕訳テーブルの作成 CREATE TABLE test_journals ( company_id CHAR(43) NOT NULL, journal_id INT NOT NULL, account_id CHAR(6), amount BIGINT, PRIMARY KEY (company_id, journal_id, account_id) ) DEFAULT CHARSET=utf8; --テストデータ INSERT INTO test_journals VALUES('comd363bb1d6f474b82cc106cfa2303086fa0a671ab','1','AAAAAA','100000'); INSERT INTO test_journals VALUES('comd363bb1d6f474b82cc106cfa2303086fa0a671ab','1','BBBBBB','-100000'); --試算表テーブルの作成 CREATE TABLE test_trial_balances ( company_id CHAR(43) NOT NULL, account_id CHAR(6), total_amount BIGINT, PRIMARY KEY (company_id, account_id) ) DEFAULT CHARSET=utf8;
当初、以下のトリガーを作成し、成功しました。
GroupByをしている場合、ON DUPLICATE KEY UPDATEが使えないようですのでdelete from ~文を入れています。
delimiter // CREATE TRIGGER update_tb_by_journal AFTER INSERT ON test_journals FOR EACH ROW BEGIN delete from test_trial_balances; INSERT INTO test_trial_balances (company_id, account_id, total_amount) (SELECT company_id,account_id, SUM(amount) FROM test_journals GROUP BY company_id, account_id); END ;// delimiter ;
しかし、上記の方法では全データを一度削除し、全データをINSERT SELECTするためデータベースに負荷がかかるのと、あるcompanyの操作で他のすべてのcompany
のデータが操作されてしまう点に懸念があります。
そこで仕訳テーブルにINSERTされたcompany_id及びaccount_idの組み合わせのデータのみINSERT SELECTしたいのですがどのようにすればよいでしょうか。
いろいろ調べてみましたが良案が見つからずアドバイスいただけると幸いです。
また、INSERT SELECT以外にも方法がありましたらご教示いただけますと幸いです。
宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/30 11:35
2019/07/30 12:40
2019/08/05 01:30