2012-01-25 2 views
0

CSV 파일에 많은 수의 레코드가 있습니다.레코드를 그룹으로 분할합니까?

하나의 쿼리에 여러 개의 Insert를 구현하려고하지만 전체 레코드에서 몇 개의 단일 쿼리가 필요한지 연습해야합니다. 예를 들어

는 :

$totalRecord = 1620; 

그래서 나는 17 개 쿼리를해야합니다. 16 쿼리에는 100 개의 Insert 레코드가 있고 17 번째 쿼리에는 20 개의 레코드가 있습니다.

$totalRecord의 수는이 문제를 해결하는 방법 500,00

-1 사이에 아무것도 할 수 있는가?

예 :

Query 1: 
INSERT INTO [table] 
([field1], [field2], [field3]) VALUES 
('[value1.1]', '[value1.2]', '[value1.3]'), 
('[value2.1]', '[value2.2]', '[value2.3]'), 
('[value3.1]', '[value3.2]', '[value3.3]'), 

Query 2: 
INSERT INTO [table] 
([field1], [field2], [field3]) VALUES 
('[value1.1]', '[value1.2]', '[value1.3]'), 
('[value2.1]', '[value2.2]', '[value2.3]'), 
('[value3.1]', '[value3.2]', '[value3.3]'), 
+0

일회성 작업입니까 아니면 자주 수행 하시겠습니까? 일회용이라면 CSV 또는 코드에서 데이터베이스로 직접 가져 오는 것이 fgetcsv()를 사용하고 루프에 삽입하는 것이 더 낫습니다. –

+0

@Michael 매주 한 번 자주 좋아할 것입니다. 이것은'fgetcsv()'를하고 루프에 삽입하지만 100,000 개가 넘는 레코드는 너무 느립니다. 따라서 여러 개의 삽입 쿼리를 그룹화해야합니다. 필요한 그룹 수를 계산하는 방법은 무엇입니까? –

+0

어쩌면 준비된 진술에 대해 읽어 보셨습니까? link -> http://php.net/manual/en/pdo.prepared-statements.php – Tudor

답변

2

사용 계수 및 부문 :

$recordsineachquery = 100; 
$recordsinlastquery = $totalrecords % $recordsineachquery; 
$fullqueries = ($totalrecords - $recordsinlastquery)/$recordsineachquery; 
$totalqueries = $fullqueries + 1; 
+0

+1, 좋은 물건을 읽으십시오. – davidethell

0

사용 정수 나누기는 마지막 세트에 얼마나 많은 삽입 알아 보려면 그룹의 수와 나머지 연산자를 찾을 수 있습니다 :

// You have to round the division result because PHP doesn't do integer division. 
$numGroups = (int)($totalRecords/100); 
$remainder = $totalRecords % 100; 
0

당신이 뭔가를 할 수 있습니다

$batchProcessLimit = 100; 
$batchStep = 0; 

$query = "INSERT INTO [table] ([field1], [field2], [field3]) VALUES "; 

foreach($rows as $row) 
{ 
    $query .= "('[value1.1]', '[value1.2]', '[value1.3]')" 

    if ($batchProcessLimit % ++$batchStep != 0) $query .= ","; 
    else 
    { 
     // execute the query 

     $query = "INSERT INTO [table] ([field1], [field2], [field3]) VALUES "; 
    } 
} 

// execute the query for remaining rows 
관련 문제