2009-07-03 5 views
1

테이블에 거대한 데이터를 검색하는 스크립트가 있습니다. 다른 필드를 가진 다른 데이터베이스 테이블에 데이터를 삽입하기 위해 mysqldump를 만들고 싶다. 필자는 INSERT INTO 테이블 값 (values1), (values2), ... (values100)을 반복하는 phpMyAdmin의 형식을 원한다. 일정 금액의 가치에 도달하면 설정 한 내용에 따라 다릅니다.phpMyAdmin과 같은 mysql 덤프 생성

예 : 550 데이터 세트가 있고 100을 기준으로 데이터를 나누어서 6 세트의 INSERT INTO 쿼리가 있어야합니다.

INSERT INTO tablename VALUES(value1), (value2), .... (value100); 
INSERT INTO tablename VALUES(value101), (value102), .... (value200); 
INSERT INTO tablename VALUES(value201), (value202), .... (value300); 
INSERT INTO tablename VALUES(value301), (value302), .... (value400); 
INSERT INTO tablename VALUES(value401), (value402), .... (value500); 
INSERT INTO tablename VALUES(value501), (value502), .... (value550); 

답변

0

당신은 array_chunk()을 사용할 수 있습니다, 뭔가 같은 :

$toInsert = array('(values1)', '(values2)', '(values3)', '(values4)'); //etc. 

$sqlStart = 'INSERT INTO tablename (field1, field2, field3, etc) VALUES '; 
foreach (array_chunk($toInsert, 100) as $insertSet) { 
    $sql = $sqlStart . implode(', ', $insertSet); 
    //execute $sql 
} 

는 당신이 실제로 데이터를 많이하고 그래도? 당신은 이것으로 모든 것을 SQL로 할 수있을 것입니다 INSERT INTO table (field1, field2) SELECT somefield, somefield2 FROM another table

+0

감사합니다. 값에 기본 키 값이없는 경우에도 auto_increment 기본 키를 사용하는 방법에 대해 알고 계십니까? – christian

+0

무슨 뜻인지 모르겠다. INSERT에서 기본 키를 생략하면 키가 작성되지만, 생략 할 항목을 지정할 수 있도록 삽입중인 필드 목록을 지정해야 할 수 있습니다. –

+0

다시 한번 감사드립니다. 필드 이름을 포함하고 기본 키 필드를 생략해야합니다. – christian

0

카운터를 늘리거나 카운터를 증가시키면서 특정 값에 도달하면 새로운 삽입 문을 작성합니까?

(오랜 시간에 대한 PHP) 정확하지 않을 수도 있습니다 일부 코드,하지만 당신은 아마 당신이 mysqldump를를 사용하는 경우 아이디어

$i = 0; 
$insertstatements = array(); 
$currentinsertstatement; 

while ($temp = mysql_fetch_assoc($result)) { 
    // do something with the data 
    $insertpart = "(value_xxx)"; 
    if ($i % 100 == 0) { 
    // first value 
    if ($i != 0) $insertstatements[count($insertstatements)] = $currentinsertstatement; 
    $currentinsertstatement = "INSERT INTO tablename VALUES " . $insertpart; 
    } else { 
    $currentinsertstatement .= ", " . $insertpart; 
    // somewhere in the middle of the insert statement 
    } 
    $i++; 
} 
if ($i % 100 != 0) { 
    $insertstatements[count($insertstatements] = $currentinsertstatement; 
} 
1

을 얻고 하나의 삽입으로 출력하여 여러개의 행을 기원합니다

mysqldump extended insert option

나는 그것이 특정 행 번호가 생성 각 INSERT 문에 포함되어 있는지 지정하는 mysqldump를 함께 지정할 수있어 확실하지 않다 : 당신은 --extended-삽입 옵션을 사용할 필요가 멍청한 놈. 대신 net_buffer_length를 설정할 수 있습니다 (변경하지 않는 것이 좋지만). 실제 금액은 각 행의 데이터에 따라 다를 수 있습니다.

0
스토리지 엔진 (이노 디비 등)을 지원하는 경우는 확실히, 거대한 삽입에 대한 트랜잭션을 사용한다

:

BEGIN;
INSERT INTO tablename VALUES ...
INSERT INTO tablename VALUES ...
COMMIT; 뭔가 잘못되면

, 안전하게 등, 당신이 스크립트를 다시 시작, 마지막 작업을 롤백 할 수

관련 문제