MySQL5.7.7RCでは、列の値を定義によって自動生成可能なGenerated Columunsという機能が追加されています。
MS SQLやDB2でも同じような機能があって、頻度は多く無いですが、以前データベースの運用していた時にTAXの自動計算などで利用していました。
以下のブログには、XMLとの連携を行った例が書かれているので参考にしてみて頂ければと思います。
Generated Columns in MySQL 5.7.5
http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/
例) Generated Columinを利用して合計金額を持つ列を生成
CREATE TABLE `T_Generated_Column` ( `pid` int(10) unsigned NOT NULL AUTO_INCREMENT, `pname` varchar(1024) DEFAULT NULL, `price` decimal(10,2) DEFAULT NULL, `qty` int(10) DEFAULT NULL, `total` decimal(10,2) GENERATED ALWAYS AS (price * qty) STORED, PRIMARY KEY (`pid`), KEY `IDX_TOTAL` (`total`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
データをINSERTしてINDEX利用の有無の確認
GENERATED COLUMNSの種類
– VIRTUAL(default) : 読み込み時に計算され, データ保存されず,インデックスの作成不可
– STORED: inserted/updated時に計算され,データは保存され,インデックス作成可能
root@localhost [USER01]> desc T_Generated_Column; +-------+------------------+------+-----+---------+------------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+------------------+ | pid | int(10) unsigned | NO | PRI | NULL | auto_increment | | pname | varchar(1024) | YES | | NULL | | | price | decimal(10,2) | YES | | NULL | | | qty | int(10) | YES | | NULL | | | total | decimal(10,2) | YES | MUL | NULL | STORED GENERATED | +-------+------------------+------+-----+---------+------------------+ 5 rows in set (0.15 sec) root@localhost [USER01]> select * from T_Generated_Column; +-----+-----------+----------+------+-----------+ | pid | pname | price | qty | total | +-----+-----------+----------+------+-----------+ | 1 | 自転車 | 10000.00 | 3 | 30000.00 | | 2 | TV | 30000.00 | 5 | 150000.00 | | 3 | 冷蔵庫 | 50000.00 | 1 | 50000.00 | +-----+-----------+----------+------+-----------+ 3 rows in set (0.00 sec) root@localhost [USER01]> insert into T_Generated_Column(pname,price,qty) values('電池',100,5); Query OK, 1 row affected (0.01 sec) root@localhost [USER01]> select * from T_Generated_Column; +-----+-----------+----------+------+-----------+ | pid | pname | price | qty | total | +-----+-----------+----------+------+-----------+ | 1 | 自転車 | 10000.00 | 3 | 30000.00 | | 2 | TV | 30000.00 | 5 | 150000.00 | | 3 | 冷蔵庫 | 50000.00 | 1 | 50000.00 | | 4 | 電池 | 100.00 | 5 | 500.00 | +-----+-----------+----------+------+-----------+ 4 rows in set (0.00 sec) root@localhost [USER01]> explain select * from T_Generated_Column where total = 500; +----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+ | 1 | SIMPLE | T_Generated_Column | NULL | ref | IDX_TOTAL | IDX_TOTAL | 6 | const | 1 | 100.00 | NULL | +----+-------------+--------------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.01 sec) root@localhost [USER01]> select * from T_Generated_Column where total = 500; +-----+--------+--------+------+--------+ | pid | pname | price | qty | total | +-----+--------+--------+------+--------+ | 4 | 電池 | 100.00 | 5 | 500.00 | +-----+--------+--------+------+--------+ 1 row in set (0.00 sec) root@localhost [USER01]>
アプリ側の変更しないでもDB側でまとめて対応出来るという意味で、簡易的にデータの値を変更出来るので、
使い方によっては、データ運用の選択肢として使えるソリューションの一つかと思います。
まだ、RC版ですが検証環境にて試してみて頂ければと思います。