У меня есть файл размером 500 МБ, который содержит данные, которые мне нужны для обновления таблицы, содержащей 10 миллионов строк, поэтому я использую этот код при использовании библиотеки QT SQL
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
// my database info
db.transaction(); // start the transaction
QSqlQuery q;
QString sql = ""; // to append many sql statment to this string
QFile file(dataFile);
file.open(QIODevice::Text | QIODevice::ReadOnly);
QTextStream stream(&file);
int counter = 0;
clock_t tStart = clock();
while (!stream.atEnd()) {
counter++;
QString str = stream.readLine();
QStringList list = str.split(';');
QString id = list[0];
QString streetName = list[1];
QString HouseName = list[2];
QString HouseNumber = list[3];
QString city = list[4];
QString postalCode = list[5];
QString temp_sql = "UPDATE temp_table_copy SET street_name='!1', house_number='!2',postal_code='!3',address_city='!4', house='!5' where id=" + id + ";";
temp_sql = temp_sql.replace("!1", streetName);
temp_sql = temp_sql.replace("!2", HouseNumber);
temp_sql = temp_sql.replace("!3", postalCode);
temp_sql = temp_sql.replace("!4", city);
temp_sql = temp_sql.replace("!5", HouseName);
sql += temp_sql;
if (sql.size() >= 100000) {
if (!q.exec(sql)) {
qDebug() << "Excute Error: " << q.lastError().text();
}
sql = "";
printf("Finished: %d sql statment\n", counter);
}
if (counter == Number)
break;
}
if (!sql.isEmpty()) {
if (!q.exec(sql)) {
qDebug() << "Excute Error: " << q.lastError().text();
}
printf("Finished: %d sql statment\n", counter);
}
db.commit(); // commit and
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
db.close();
. Я добавляю большую строку SQL с помощью оператора SQL, и когда она достигает размера 100 000, я выполняю ее и очищаю строку, чтобы избежать неправильного размещения, когда строка слишком большого размера в памяти, а также я читаю это MySQL база данных имеет определенный размер для выполняемой инструкции SQL, и я получаю ее предел с помощью
SHOW VARIABLES LIKE 'max_allowed_packet';
проблема здесь в том, что не все данные обновляются, некоторые идентификаторы имеют значение в текстовом файле и не обновляется внутри таблицы базы данных MySQL, в чем может быть проблема? эти столбцы перед обновлением не имеют значения, поэтому, когда я пытаюсь подсчитать, сколько не было обновлений, я обнаружил только 7M, что означает, что некоторые идентификаторы не обновляются, а также я не получил никакой ошибки в запросе, никакой помощи или предложения, чтобы узнать, почему это произошло, или лучший способ сделать это.
Заранее спасибо.