我有一个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);
答案 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