Это возможное сделать массовое копирование в mysql

Я должен вставить несколько строк в свои строки Mysql database.my, доступны в моем наборе данных.

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

5
задан TinTin 12 May 2010 в 18:36
поделиться

2 ответа

Вы можете вставить несколько строк с помощью одного 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 Injections."
  2. Я использую класс StringBuilder, вместо того, чтобы использовать строковый примитив и просто добавлять (т.е. string s = "Insert..."; s+="blah blah blah"), потому что StringBuilder быстрее добавляет, потому что он не рассматривается как массив, и поэтому ему не нужно изменять размер при добавлении.
3
ответ дан 15 December 2019 в 00:53
поделиться

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

В случае ЗАГРУЗКИ ДАННЫХ ЛОКАЛЬНЫЙ, файл передается от клиента на сервер и вставляется как большой пакет. Это не ограничено максимальным размером пакета (как INSERT), но по-прежнему ограничено максимальной транзакцией, которую вы можете откатить в innodb - все это происходит в одной транзакции, поэтому, если она слишком велика, она превысит ваш откат пространство, и в любом случае, если вы откатываете очень большую транзакцию, это занимает много времени и влияет на сервер.

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

1
ответ дан 15 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: