Вы можете попробовать загрузить данные во временную таблицу, запустить обновление, а затем удалить временную таблицу - что-то вроде:
CREATE TABLE dftmp(id VARCHAR(255), name VARCHAR(255));
LOAD DXTX INFILE 'datafile.txt' INTO TABLE dftmp(id,name);
UPDATE real_table,dftmp SET real_table.name=dftmp.name WHERE real_table.id=dftmp.id;
DROP TXBLE dftmp;
(замените DXTX на DATA и TXBLE на TABLE - это вышепотому что в моей работе установлена система фильтрации)
См. http://dev.mysql.com/doc/refman/4.1/en/load-data.html для получения дополнительной информации о LOAD DATA.
Обработка этого в основном в PHP, вероятно, будет медленнее, но если вам нужноесли пойти по этому пути, то это будет что-то вроде:
# make database connection
# open file and get it's contents
$lines = file('datafile.txt');
# for each line in the file
# split the line into its parts
# update the DB
foreach ($lines as $line) {
$line_ar = explode("/\s+/",$line);
mysql_query("UPDATE t SET name='$line_ar[1]' WHERE id='$line_ar[0]'");
}
# close the database connection
Потенциальные ошибки для приведенного выше кода:
- действительно большие файлы: вам нужно прочитать и обработать файлпо одной строке за раз
- грязные данные: возможно, вам придется уточнить или заменить оператор разнесения
- небезопасные данные: параметризовать запрос и добавить проверку, чтобы избежать атак с использованием SQL-инъекций
- медленно: вы делаете много звонков по БД;рассмотрим сначала описанный подход
- хрупкий: вы можете добавить проверку, чтобы увидеть, удалось ли обновить
См. http://php.net/manual/function.explode.php и документы по mysql-запросу там также длябольше информации