每月自动添加兴趣

时间:2013-06-07 21:09:23

标签: php mysql triggers

我有一个MySQL数据库,应该涵盖账户/客户的交易金额。此数据库包含两个表,一个是clientInfo,另一个是transaction

  • 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);

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以尝试将MySql events用于

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;启用调度程序。 有关配置事件调度程序here

的更多信息

答案 2 :(得分:1)

首先,您执行此操作的方式效率不高 - 您正在检索所有帐户,然后逐个插入兴趣交易。随着帐户数量的增加,PHP脚本将变慢;最终,它将超过PHP的脚本超时设置,然后您的一些帐户将应用兴趣,而有些则不会。

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

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

这应该明显更快,你可以将它包装在一个事务中,以保证它全部工作或全部失败。

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

最后,您的解决方案似乎不完整 - 因为您将余额存储在两个位置(客户信息和交易),您必须在两个位置更新它;您提供的代码仅在事务中更新它。那可能是个错误...

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

select ai.account_id, 
       sum(t.debit)
from   acountInfo ai, 
       transaction t
where  ai.id = t.account_id
group by ai.account_id