Laravel 5.4中使用多个表连接处理数百万行的高效且交易安全的方法

时间:2017-03-24 08:23:59

标签: php mysql laravel join transactions

这不一定只适用于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自动插入/更新。

  1. 该应用程序计划根据包的更新表用户中的余额列(已分配给用户)乘以百分比字段加上原始余额值,每天午夜12:00。更明确的表达方式是:

      

    users.balance = users.balance +(packages.value * packages.percent)

  2. 同时,应将每个余额更新的事务日志插入到数据库中:

      

    user_id:[用户ID]
      说明:用新余额更新了用户[用户名]   金额:[加入量]

  3. 我已经设法使用以下SQL语句实现第一个操作:

    UPDATE users 
    INNER JOIN packages 
    ON users.package_id = packages.id
    SET users.balance = users.balance + (packages.value * packages.percent);
    

    我似乎无法找到任何解决方案来同时实现这两项操作,并且效率最高且交易安全。我可以检索用户和包并在应用程序中处理它们然后执行UPDATE和INSERT,但它是一件很简单的事情,因为它真的很低效。

    如果有人可以帮我解决问题,我会很感激!

2 个答案:

答案 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更改/更新时,这将更新日志表。

希望这有帮助。