插入具有检查重复项和字段重复项之和值的批处理php mysql

时间:2019-02-28 03:26:59

标签: php mysql sql performance

我使用foreach拥有一百万个数据。 表格: table

数据 data 我想使用批处理/多重插入插入数据,但是当我得到重复数据时出现问题。如果我希望重复数据,则字段数量将求和并使用重复数量总和数据更新数量字段。

这是我之前的代码

<?php
foreach ($data_transaksi as $key)
      {
          if($key['STATUS_COA'] != $key['CHART_OF_ACCOUNT_STATUS'])
          {
              if($key['ACCOUNT_CATEGORY_CODE'] == '9')
              {
                  $amount = round($key['AMOUNT'],2);
              }
              else
              {
                  $amount = round($key['AMOUNT'],2) *-1;
              }
          }
          else
          {
              if($key['ACCOUNT_CATEGORY_CODE'] == '9')
              {
                  $amount = round($key['AMOUNT'],2)*-1;
              }
              else
              {
                  $amount = round($key['AMOUNT'],2);
              }
          }

          
          $dt_exsis = $this->ledger_model->cek_data_coa_exsis($key['COA_CODE'],$modul,$ID_USER);
          if(empty($dt_exsis['id']))
          {
              //TRYINSERTINGBATCH
              // $datainsert[] = '('.$key['COA_CODE'].','.$amount.','.$ID_USER.',"'.$modul.'")';
              // $test = $key['COA_CODE'];

              $datainput = array(
                      'COA_CODE' => $key['COA_CODE'],
                      'AMOUNT' => $amount,
                      'MODUL' => $modul,
                      'USER_ID' => $ID_USER
                      );
                      
              $this->ledger_model->save_rows_to_table($datainput,'finance_lapkue_temp');
          }
          else
          {
              $amount_fix = $amount + $dt_exsis['AMOUNT'];
              $data=array(
                'AMOUNT' => $amount_fix
              );
              $this->ledger_model->edit_rows_to_table_where($data,'finance_lapkue_temp','id',$dt_exsis['id']);
              // $q = "UPDATE finance_lapkue_temp set AMOUNT = '$amount_fix' where id = '".$dt_exsis['id']."'";
              // $this->db->query($q);
          }
          // $data_amount[$key['COA_CODE']] += $amount;
      }
     ?>

如果我使用此代码,那么过程太慢了

1 个答案:

答案 0 :(得分:0)

好的选项将仅将数据传递到要插入的数据库。所有数据清理任务都可以在控制器中完成。

// Create a data array and add all info
$data = [];
//if user does not exist add it in array
if (empty($dt_exist($id))) {
  $data[$ID_USER] = array(
                  'COA_CODE' => $key['COA_CODE'],
                  'AMOUNT' => $amount,
                  'MODUL' => $modul,
                  'USER_ID' => $ID_USER
                  );
}
else {
      //if user exist in $data just modify the amount
      if (!empty($data[$ID_USER])) {
        $data[$ID_USER]['AMOUNT'] += $dt_exsis['AMOUNT']; 
     }
      else {
        // if user does not exist in data create add all info
        $data[$dt_exsis['ID_USER']] = array(
                  'COA_CODE' => $dt_exsis['COA_CODE'],
                  'AMOUNT' => $dt_exsis['amount'],
                  'MODUL' => $dt_exsis['modul'],
                  'USER_ID' => $dt_exsis['ID_USER']
                  );
    }
}

这将保存对DB的多次调用,最后您可以传递$ data并进行多次插入。