2016-11-15 8 views
1

ほとんど10000個のレコードを挿入または更新します。 forループに挿入するには時間がかかります。別の方法では値を挿入するだけですが、duplicate_keyエントリにはエラーが表示されます。MysqlはYii Frameworkを挿入して更新するのに長い時間がかかります

$var=0; 

    if($method == 1) 
    { 

// $sql5 is the current way trying but shows error 

    $sql5='insert into stu_regnum_hall(hall_name,row,column,register_number,subject_code,exam_date,session,unique_key) values'; 
for ($i = 0; $i <=$arr_length; $i++) 
{ 
for ($j = 1; $j <= 5; $j++) 
{ 
for($k=0;$k<=4;$k++) 
{ 
if(isset($show[$var+$k])) 
{ 
if($k==0) 
{ 
$hall_name=$arr1[$i]; 
$row=$j; 
} 
$column=$k+1; 
$reg_num=$show[$var+$k]; 
$sub_code=$newArr12[$var+$k]; 
$unique_key=$reg_num.$date.$session; 

//current way to insert This is taking too long time to store nearly 10000 records                     

Yii::$app->db->createCommand('insert into stu_regnum_hall(hall_name,row,column,register_number,subject_code,exam_date,session,unique_key) values ("'.$hall_name.'","'.$row.'","'.$column.'","'.$reg_num.'","'.$sub_code.'","'.$date.'","'.$session.'","'.$unique_key.'") ON DUPLICATE KEY UPDATE hall_name ="'.$hall_name.'",row="'.$row.'",column="'.$column.'",register_number="'.$reg_num.'",subject_code="'.$sub_code.'",exam_date="'.$date.'",session="'.$session.'",unique_key="'.$unique_key.'"')->query();        

//concatenation of $sql5 
$sql5.='("'.$hall_name.'","'.$row.'","'.$column.'","'.$reg_num.'","'.$sub_code.'","'.$date.'","'.$session.'","'.$unique_key.'") ON DUPLICATE KEY UPDATE hall_name= "'.$hall_name.'",row="'.$row.'",column="'.$column.'",register_number="'.$reg_num.'",subject_code="'.$sub_code.'",exam_date="'.$date.'",session="'.$session.'",unique_ key="'.$unique_key.'",'; 
    } 
else 
{ 
break; 
} 
} 
$var=$var+5; 
} 
} 

$sql5.='("");'; 

    // This is the required answer but getting error                          
    Yii::$app->db->createCommand($sql5)->query(); 
    } 

$ sql5クエリは少しカスタム使用INSERT IGNOREREPLACEまたはON DUPLICATE KEY UPDATEYii2 batchInsertを試してみてください。この

+0

longにどのくらいですか? –

+0

10000レコードで約5分。 insertクエリは毎回forループで実行されます。その理由は –

+0

です。自動化されたデータで満たしているので、仕事のスピードの1つになることは問題ではありません。 –

答えて

1

で動作するはずです。非常に高速に挿入されます。

$sql = Yii::$app->db->queryBuilder->batchInsert('your_table_name', ['column1', 'column2','column3',...], $dataArray); 
// For IGNORE on Duplicate 
//$sql = 'INSERT IGNORE' . mb_substr($sql, strlen('INSERT')); 
// For Replace on Duplicate 
//$sql = 'REPLACE' . mb_substr($sql, strlen('INSERT')); 
// For Update on Duplicate 
$sql .= ' ON DUPLICATE KEY UPDATE `column1` = VALUES(`column1`), `column2` = VALUES(`column2`), ...'; 

Yii::$app->db->createCommand($sql)->execute(); 

参照してください:http://www.yiiframework.com/doc-2.0/yii-db-querybuilder.html#batchInsert()-detail

+0

無視してはならない場合は、ユニークなキーを更新する必要があります –

+0

@SanthoshPrabu問題なし –

+0

Van Thao私はこれを更新しようとしています –

関連する問題