Общие > Базы данных
Mass change in the mySQL base
Creator:
Есть проблема, есть теория, но нет реального решения. Изложу в кратце...
Существует сиквеловская база (порядка 15тыс. записей). В базе где то около 20 таблиц, в среднем по 15 полей в каждой.
Цель: Нужно произвести выборку вхождений и произвести их замену. Например: есть запись "aaa.333.xxx*123" в которой нужно заменить вхождение "xxx*123" на "444-45-56", в результате чего должна получится запись типа "ааа.333.444-45-56".
Вот и пришли к вопросу: как это сделать?
база на уделенном сервере (Линукс), шелла нет, фтп доступ есть. cgi-bin соответственно тоже есть.
fidget:
Есть такая функция для строк, как REPLACE()
http://www.mysql.com/doc/S/t/String_functions.html
только одним MySQLем все равно не отделаешься ...
тебе вначале придется сделать выборку значений, которые ты апдейтить будешь, а потом уже делать апдейт в таблице...
Chs:
--- Цитировать ---как это сделать?
--- Конец цитаты ---
Вариант раз: ручками. У меня, например, есть скрипт (перл) очень простой, реализующий интерфейс командной строки к MySql. Можно взять phpMyAdmin. И update по каждой из таблиц для нужных полей.
Вариант два: на любом языке реализуешь след. алгоритм.
show tables
Для каждой из таблиц - show columns
и update по нужным полям.:)
Creator:
В общем. Выполняя SQL-запрос, я получил 5591 запись, в которой содержится искомое вхождение...
Вот запрос:
select post from forum_posts where post like \'%creator.kiev.ua/iB_html%\' order by post limit 0, 20
что далее?
Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:
#!/usr/bin/perl
$sqlbase = "base_name";
$sqluser = "base_user";
$sqlpass = "base_passwd";
$table = "base_table_name";
use MySQL;
$db = Mysql->connect(\'localhost\', $sqlbase, $sqluser, $sqlpass);
$get = $db->query("SELECT post_id,topic_id,forum_id,post FROM $table");
while (($post_id,$topic_id,$forum_id,$post) = $get->fetchrow) {
$post =~ s|creator.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$post =~ s|enola.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$db->query("UPDATE $table SET post=$post WHERE post_id=$post_id AND topic_id=$topic_id AND forum_id=$forum_id");
}
exit;
может в нем что то не так?
Chs:
--- Цитировать ---Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:
--- Конец цитаты ---
Сделай dump базы,в случае чего восстановишся.
Можно попробовать замену на первых n записях, поставив LIMIT 0,n.
Проверить, и если все нормально прогнать по всем.
--- Цитировать ---
$post =~ s|creator.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
$post =~ s|enola.kiev.ua/iB_html|unlimit.kiev.ua/ib|ig;
--- Конец цитаты ---
$post =~ s|creator\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
$post =~ s|enola\\.kiev\\.ua/iB_html|unlimit\\.kiev\\.ua/ib|ig;
И на будущее - не стоит использовать модуль MySql поскольку он obsoleted. :)
Навигация
Перейти к полной версии