1

我有一个 MySQL 数据库,它应该涵盖账户/客户的交易金额。该数据库包含两张表,一张clientInfotransaction.

  • clientInfo包含有关帐户/客户的所有信息。
  • transaction表包含与帐户完成的交易相关的所有信息。

问题:

每个月我都必须根据每个帐户的可用信息为每个帐户添加兴趣,clientInfo并且也必须将其添加到transaction表中。我可以使用以下 PHP 代码手动完成。

$query = "SELECT id,balance,percentage from clientInfo";
$result = mysql_query($query);
while($row = mysql_fetch_Array($result)){
$ID = $row['ID'];
$balance = $row['balance'];
$percentage = $row['percent'];

$debit = $balance * $percentage / 100;
$balance += debit;
$insertQuery = "INSERT INTO transaction VALUES ( $ID,$debit,$balance);
4

3 回答 3

2

您可以设置 cron 作业,它将在指定时间运行查询。

于 2013-06-07T21:11:08.343 回答
1

首先,您这样做的方式不是很有效 - 您正在检索所有帐户,然后一一插入利息交易。随着账户数量的增长,PHP 脚本会变慢;最终,它将超过 PHP 的脚本超时设置,然后您的一些帐户将应用利息,而有些则不会。

相反,您可以在 SQL 中完成所有操作:

insert  into transaction
select  ID, 
        balance * percentage / 100, 
        balance
from    clientinfo

这应该会更快,并且您可以将其包装在事务中以保证它要么全部工作要么全部失败。

自动运行它的两个选项是 MySQL 事件(正如 peterM 建议的那样)或操作系统的任务调度程序(Cron,在 *nix 系统上)。不过,我不太喜欢数据库中的“神奇事件”——它们通常在你不需要它们的时候运行,它们很难调试,而且很容易忘记它们并安排冲突事件(例如,操作系统升级)。我绝对会建议限制它们的使用。

最后,您的解决方案似乎不完整 - 因为您将余额存储在两个地方(客户信息和交易),您必须在两个地方更新它;您提供的代码仅在事务中更新它。这应该是bug吧……

编辑:数据库规范化的主要教训之一是不要将信息存储在一个以上的地方。从逻辑上讲,任何一个账户的余额应该是该账户发生的所有交易的总和。因此,在适当规范化的数据库设计中,您根本没有“余额”列 - 您会执行以下操作:

select ai.account_id, 
       sum(t.debit)
from   acountInfo ai, 
       transaction t
where  ai.id = t.account_id
group by ai.account_id
于 2013-06-09T10:15:35.493 回答
1

您可以尝试为此使用MySql事件

CREATE EVENT event_add_interest
ON SCHEDULE EVERY 1 MONTH STARTS LAST_DAY(CURDATE())
DO
  INSERT INTO transaction
  SELECT id, balance * percent / 100, balance + (balance * percent / 100)
    FROM clientInfo;

用于SHOW PROCESSLIST检查是否启用了事件调度程序。如果它打开,您应该看到Daemon用户“ ”的进程“ event_scheduler”。SET GLOBAL event_scheduler = ON;如果当前未启用,则用于启用调度程序。有关在此处配置事件调度程序的更多信息

于 2013-06-07T22:10:52.397 回答