2

約 100 の口座の残高を含むテーブルがあります (変数です)。アカウントごとに 1 つのレコード。残高は継続的に更新されますが、現在の残高を毎日アーカイブする最良の方法を見つけたいと思います.

これを行う最も効率的な方法を探しています。

テーブル スキーマ:

-- --------------------------------------------------------
--
-- Table structure for table `acc_bals`
--
-- Holds the tracks the balances of all coa's and bank accounts
CREATE TABLE IF NOT EXISTS `acc_bals` (
    `id` INT(11) NOT NULL auto_increment,
    `acc_type` TINYINT(4) NOT NULL comment '1 - coa; 2 - bank accounts',
    `acc_id` SMALLINT(5) NOT NULL,
    `acct_balance` VARBINARY(40) NOT NULL,
    PRIMARY KEY (id)
)  engine=InnoDB DEFAULT charset=utf8 auto_increment=1;

--
-- Table structure for table `balance_archive`
--
CREATE TABLE IF NOT EXISTS `balance_archive` (
  `id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `date` date NOT NULL COMMENT 'Beginning of the day for which this value was archived for..',
  `coa_id` smallint(4) unsigned NOT NULL COMMENT 'Foreign ID of COA.',
  `bal` varbinary(27) NOT NULL COMMENT 'Archived COA balance at beginning of specified date.',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

varbinary 列の理由は、残高が暗号化されているためです。

私はもともとacc_bals、すべてのアカウント ID と値をクエリして配列に入れ、値を復号化してから、2 番目のクエリを実行し、配列内の各アイテムに対してそれをアーカイブ テーブルにコピーすることを考えていました。

その後、おそらく値を復号化する必要がまったくないので、多くの処理を節約でき、さらに、単一のクエリでこれを実行できる可能性があることに気付きました。

私のアプローチが正しいと思われる場合、おそらく誰かがそのクエリがどのように見えるかを提案できますか?

MySQL PDO を使用しています。

4

1 に答える 1

3

選択するだけで、毎日設定された定期的なイベントで実行できます。何かのようなもの :

insert into balance_archive (date,coa_id,bal)
select now(),ab.id,ab.acct_balance
from acc_bals ab

そうすれば、PHP をまったく使用する必要がなく、MySql のみで実行できます。

于 2013-05-06T07:09:08.967 に答える