【问题标题】:Retrieve data from one table and insert/update in another table in mysql从一个表中检索数据并在mysql的另一个表中插入/更新
【发布时间】:2020-01-08 07:30:58
【问题描述】:

我想使用某些条件从三个表中检索数据,然后在另外三个表中插入/更新。这是一个非常简单的过程,其脚本是用php开发的。但问题是从每个表中检索到的记录是 100k+。 PHP 脚本仅在少量记录的情况下运行,并且对大数据给出超时错误。谁能建议如何解决这个问题。所有三个表数据都需要在运行时获取。下面是我的 php 脚本,它给出了超时错误

switch($action){
    case 'tequipebudget': 
        $oldPresta              =  budPrestaDataTransfer::getOldPresta('tequipebudget'); 
        $budProviderBudget      =  budPrestaDataTransfer::updatebudProviderBudget($oldPresta, 'budproviderbudget', 3); 
    break;
    case 'tequipebudgetjum': 
        $oldPrestaJum           =  budPrestaDataTransfer::getOldPresta('tequipebudgetjum'); 
        $budProviderBudgetJum   =  budPrestaDataTransfer::updatebudProviderBudget($oldPrestaJum, 'budproviderbudgetjum', 3); 
    break;
    case 'tequipebudgetavhisto':
        $oldPrestaAvHisto           =  budPrestaDataTransfer::getOldPresta('tequipebudgetavhisto'); 
        $budProviderBudgetAvHisto   =  budPrestaDataTransfer::updatebudProviderBudget($oldPrestaAvHisto, 'budproviderbudgetavhisto', 3); 
    break;
}
static public function getOldPresta($table) {
        $sql        = "SELECT Annee, CodeEntite, CodeProjet,  MtBudgetAEquipeKE, projet_id";  
        if($table == 'tequipebudgetavhisto') {
            $sql    .= " ,avenant_id ";
        }
        $sql        .= " FROM ".$table." WHERE Annee < 2020 ";
        $dbObj              =  budPDO::getInstance();
        $prestaList = $dbObj->getAllResults($sql);
        return $prestaList;
    }


    static public function updatebudProviderBudget($prestaList, $table, $autreId) {
        foreach($oldPresta as $key=>$val) {
            $sql      = "SELECT count(*) as cnt FROM ".$table." WHERE Annee = '".$val['Annee']."' AND CodeEntite = '".$val['CodeEntite']."' AND 
                             CodeProjet = '".$val['CodeProjet']."' AND projet_id = '".$val['projet_id']."' AND provider_id = '".$oldPresta['AuterId']."' ";
            $dbObj    =  budPDO::getInstance();
            $res      =  $dbObj->getOneRow($sql);

            if($res['cnt'] == 0){ // record does not exists in table
                $update  =  "INSERT INTO ".$table." SET Annee = '".$val['Annee']."', CodeEntite = '".$val['CodeEntite']."',
                                CodeProjet = '".$val['CodeProjet']."', cost = '".$val['MtBudgetAEquipeKE']."' ,
                                projet_id = '".$val['projet_id']."', provider_id = '".$autreId."',
                                addedon_date = '".NOW_CONST."' ";
                if($table == 'budproviderbudgetavhisto') {
                    $update .= " ,avenant_id= '".$val['avenant_id']."' ";
                }
            }else {
                $update  =  "UPDATE ".$table." SET Annee = '".$val['Annee']."', CodeEntite = '".$val['CodeEntite']."',
                                CodeProjet = '".$val['CodeProjet']."', cost = '".$val['MtBudgetAEquipeKE']."' ,
                                projet_id = '".$val['projet_id']."', provider_id = '".$autreId."',
                                modifiedon_date = '".NOW_CONST."' ";

                if($table == 'budproviderbudgetavhisto') {
                    $update .= " ,avenant_id= '".$val['avenant_id']."' ";
                }

                $update  .= " WHERE Annee = '".$val['Annee']."' AND CodeEntite = '".$val['CodeEntite']."' AND 
                             CodeProjet = '".$val['CodeProjet']."' AND projet_id = '".$val['projet_id']."' AND provider_id = '".$autreId."' ";

                if($table == 'budproviderbudgetavhisto') {
                    $update .= " AND avenant_id= '".$val['avenant_id']."' ";
                }
            }
            //echo "update -- " . $update. "<br><br>";
            $sth = $dbObj->pdo->prepare($update);
            $exec = $sth->execute();
        }
    }

【问题讨论】:

标签: php mysql


【解决方案1】:

您可以在 PHP 设置中增加超时时间。

ini_set('max_execution_time','{number of seconds}');

那么您可能还必须增加内存限制。

ini_set('memory_limit', '2GB');

但最好将大数据逻辑留给数据库。所以如果我是你,我会写一个存储过程/函数并使用 PHP only exec 执行它

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多