可以在mysql中进行批量复制吗?

时间:2010-05-12 18:36:46

标签: database mysql dataset

我需要在我的Mysql数据库中插入多行。我的数据集中有可用的行。

我正在使用for循环逐行发送行是正确的方法吗?...

2 个答案:

答案 0 :(得分:3)

您可以使用单个SQL语句插入多行,如下所示:

INSERT INTO myTable (col1, col2, col3) VALUES ('myval1', 'myval2', 'myval3'), ('myotherval1', 'myotherval2', 'myotherval3'), ('anotherval1', 'anotherval2', 'anotherval3');

更新:

MarkR在他的评论中是正确的 - 如果您正在从用户收集数据,或者您正在编译信息,则可以使用以下内容动态构建查询:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("INSERT INTO myTable (col1, col2, col3) VALUES ");
for(int i=0;i<myDataCollection.Count;i++) {
  stringBuilder.Append("(" + myDataCollection[i].Col1 + ", " + myDataCollection[i].Col2 + ", " + myDataCollection[i].Col3 + ")");
  if (i<myDataCollection.Count-1) {
    stringBuilder.Append(", ");
  } else {
    stringBuilder.Append(";");
  }
}

string insertStatement = stringBuilder.ToString();

需要注意两点:

  1. 如果您接受来自用户的输入,则非常重要来清理所有用户输入,否则恶意用户可以修改/删除/删除整个数据库。有关详情,请点击“SQL注入”。
  2. 我正在使用StringBuilder类,而不是使用字符串原语并简单地追加(即.string s =“Insert ...”; s + =“blah blah blah”)因为它的StringBuilder附加得更快,因为它不被视为数组,因此在附加到它时不需要自行调整大小。

答案 1 :(得分:1)

您可以使用LOAD DATA INFILE(或LOAD DATA LOCAL INFILE)将行从现有文件批量加载到表中。

在LOAD DATA LOCAL的情况下,文件从客户端传输到服务器并作为大批量插入。这不受最大数据包大小的限制(如INSERT所示),但它仍然受限于您可以在innodb中回滚的最大事务 - 这一切都在一个事务中进行,因此如果它太大,它将超过您的回滚空间,无论如何,如果你回滚一个非常大的事务,它需要很长时间并影响服务器。

通常情况下,不建议将多个(几十个,几百个)兆字节的数据作为单个插入或LOAD DATA加载。如果你有更多,你可以拆分它。