这不一定只适用于Laravel php框架,因为我相信我的预期任务可以在MySQL服务器本身以及适当的SQL语句上处理。
共有3个表格如下:
用户(> 200万行)
- ID
- 名称
- 余额(十进制,14,2)
- 的package_id
包(5行)
- ID
- 名称
- 值(十进制,14,2)
- 百分比(十进制,5,2) - 存储为0.10而不是10
交易(日志)
- ID
- USER_ID
- 描述
- 金额
上面的所有表分别链接到对象/模型User,Package和Transaction。它们包含时间戳列,由Laravel自动插入/更新。
该应用程序计划根据包的值更新表用户中的余额列(已分配给用户)乘以百分比字段加上原始余额值,每天午夜12:00。更明确的表达方式是:
users.balance = users.balance +(packages.value * packages.percent)
同时,应将每个余额更新的事务日志插入到数据库中:
user_id:[用户ID]
说明:用新余额更新了用户[用户名] 金额:[加入量]
我已经设法使用以下SQL语句实现第一个操作:
UPDATE users
INNER JOIN packages
ON users.package_id = packages.id
SET users.balance = users.balance + (packages.value * packages.percent);
我似乎无法找到任何解决方案来同时实现这两项操作,并且效率最高且交易安全。我可以检索用户和包并在应用程序中处理它们然后执行UPDATE和INSERT,但它是一件很简单的事情,因为它真的很低效。
如果有人可以帮我解决问题,我会很感激!
答案 0 :(得分:0)
Luke您想要更新用户记录并同时插入具有相同查询的日志记录。你应该检查Mysql重复密钥更新。 我建议查看此链接。 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html http://www.digimantra.com/tutorials/insert-update-single-mysql-query-duplicate-key/
答案 1 :(得分:0)
我没有看到任何可能的方法来更新或插入mysql中的两个不同的表。我知道用一个查询更新2个不同的表但不在2个不同的表上插入和更新。我认为您可以使用触发器来实现您想要的目标
CREATE TRIGGER insert_into_logs_when_user_balance_update
AFTER UPDATE ON users
FOR EACH ROW
IF NEW.balance <> OLD.balance
then
insert into logs(user_id, description, amount)
values(New.id, New.balance, New.balance)
END IF
当users.balance更改/更新时,这将更新日志表。
希望这有帮助。