在我的表中,我在每个负载上插入大约20,000行。现在我一个接一个地做。从mysql网站我开始知道插入多行与单插入查询更快。
我可以在单个查询中插入所有20000吗?
如果此20000行内有错误会怎样? mysql将如何处理?
答案 0 :(得分:7)
如果要插入其他表中的行,则可以使用 INSERT ... SELECT 模式插入行。
但是,如果您使用INSERT ... VALUES
模式插入值,则您具有max_allowed_packet的限制。
同样来自文档: -
要优化插入速度,请将许多小型操作合并为一个 大手术。理想情况下,您进行单个连接,发送数据 对于许多新行,同时延迟所有索引更新和一致性 检查直到最后。
实施例: -
INSERT INTO `table1` (`column1`, `column2`) VALUES ("d1", "d2"),
("d1", "d2"),
("d1", "d2"),
("d1", "d2"),
("d1", "d2");
如果这20000行内有错误会怎样?
如果插入记录时出错,则操作将中止。
答案 1 :(得分:3)
http://dev.mysql.com/doc/refman/5.5/en/insert.html
使用VALUES语法的INSERT语句可以插入多行。至 执行此操作,包括多个列值列表,每个列值都包含在其中 括号,用逗号分隔。
示例:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
您可以使用代码根据数据源生成插入VALUES
部分。
错误:如果INSERT
语句中有错误(包括在任何行中),操作将被中止。
生成查询 - 这将基于您的数据源,例如,如果您从PHP中的关联数组中获取数据,您将执行以下操作:
$sql = "INSERT INTO tbl_name (a, b, c) VALUES ";
foreach($dataset as $row)
{
$sql .= "(" + $row['a'] + ", " + $row['a'] + ", " + $row['a'] + ")";
// OR
$sql .= "($row[a], $row[b], $row[c])";
}
更多资源:
答案 2 :(得分:1)
使用SQL批量插入:插入表(col ... coln)值(col ... coln),(col ... coln)...但SQL长度受限于1M默认值,您可以更改max_allowed_packet参数支持更大的单个插入