Это возможно сделать массовое копирование в MySQL - PullRequest
5 голосов
/ 12 мая 2010

Мне нужно вставить несколько строк в мою базу данных Mysql. В моем наборе данных есть строки.

Я использую цикл для отправки строки один за другим, это правильный путь? ...

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Вы можете вставить несколько строк, используя один оператор 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. Если вы принимаете входные данные от пользователя, очень важно очистить все пользовательские данные, в противном случае злонамеренные пользователи могут изменить / удалить / удалить всю вашу базу данных. Для получения дополнительной информации, Google "SQL-инъекции".
  2. Я использую класс StringBuilder, а не строковый примитив и просто добавляю (т.е. string s = "Insert ..."; s + = "бла-бла-бла"), потому что это StringBuilder быстрее при добавлении, потому что он не обрабатывается как массив и поэтому не требует изменения размера при добавлении к нему.
1 голос
/ 12 мая 2010

Вы можете использовать LOAD DATA INFILE (или LOAD DATA LOCAL INFILE) для массовой загрузки строк в таблицу из существующего файла.

В случае LOAD DATA LOCAL, файл передается с клиента на сервер и вставляется как большой пакет. Это не ограничено максимальным размером пакета (как INSERT), но все равно ограничено максимальным количеством транзакций, которые вы можете откатить в innodb - все это происходит в одной транзакции, поэтому, если она слишком большая, она превысит ваш откат пространство, и в любом случае, если откатить очень большую транзакцию, это займет много времени и повлияет на сервер.

Обычно не рекомендуется загружать более нескольких (десятки, может быть, сотни, возможно) мегабайт данных в виде одной вставки или ЗАГРУЗИТЬ ДАННЫЕ. Если у вас есть больше, вы можете разделить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...