像phpMyAdmin一样创建mysql转储

时间:2009-07-03 09:37:17

标签: php mysql

我有一个脚本可以检索表上的大量数据。我想创建一个mysqldump来将数据插入到具有不同字段的另一个数据库表中。我想要phpMyAdmin的格式,它重复INSERT INTO表VALUES(values1),(values2),...(values100);如果达到一定数量的值集取决于您设置的内容。

例如:如果我有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);

4 个答案:

答案 0 :(得分:1)

如果您正在使用mysqldump并希望将多个行输出到单个插入中,那么您需要使用--extended-insert选项:

mysqldump extended insert option

我不确定是否可以使用mysqldump指定在转储中生成的每个INSERT语句中包含特定数量的行。相反,您可以设置net_buffer_length(虽然不建议您更改它),因此实际数量可能会因每行中的数据而异。

答案 1 :(得分:0)

获取行时,增加一个计数器,当它达到某个值时,让它创建一个新的insert语句?

某些代码可能不正确(长时间没有PHP),但您可能会理解

$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;
}

答案 2 :(得分:0)

如果你的存储引擎支持它们(比如innoDB),你绝对应该使用大量插入的事务:

BEGIN;
  INSERT INTO tablename VALUES ...
  INSERT INTO tablename VALUES ...
  COMMIT;

如果出现问题,您可以安全地回滚上一次操作,重新启动脚本等等。

答案 3 :(得分: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
}

你实际上对数据做了多少工作?您可以使用INSERT INTO table (field1, field2) SELECT somefield, somefield2 FROM another table

在SQL中完成所有操作