我有一个脚本可以检索表上的大量数据。我想创建一个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);
答案 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