Автор Тема: Mass change in the mySQL base  (Прочитано 7827 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« : 09 Апреля 2002, 10:54:46 »
Есть проблема, есть теория, но нет реального решения. Изложу в кратце...
Существует сиквеловская база (порядка 15тыс. записей). В базе где то около 20 таблиц, в среднем по 15 полей в каждой.
Цель: Нужно произвести выборку вхождений и произвести их замену. Например: есть запись "aaa.333.xxx*123" в которой нужно заменить вхождение "xxx*123" на "444-45-56", в результате чего должна получится запись типа "ааа.333.444-45-56".
Вот и пришли к вопросу: как это сделать?
база на уделенном сервере (Линукс), шелла нет, фтп доступ есть. cgi-bin соответственно тоже есть.
WBR, Creator
more about - CRUA-RIPE

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Mass change in the mySQL base
« Ответ #1 : 09 Апреля 2002, 11:10:00 »
Есть такая функция для строк, как REPLACE()
http://www.mysql.com/doc/S/t/String_functions.html

только одним MySQLем все равно не отделаешься ...
тебе вначале придется сделать выборку значений, которые ты апдейтить будешь, а потом уже делать апдейт в таблице...
На Машине Тьюринга далеко не уедешь.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Mass change in the mySQL base
« Ответ #2 : 09 Апреля 2002, 11:15:27 »
Цитировать
как это сделать?

Вариант раз: ручками. У меня, например, есть скрипт (перл) очень простой, реализующий интерфейс командной строки к MySql. Можно взять phpMyAdmin. И update по каждой из таблиц для нужных полей.

Вариант два: на любом языке реализуешь след. алгоритм.
show tables
Для каждой из таблиц - show columns
и update по нужным полям.:)
2B OR NOT 2B = FF

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #3 : 09 Апреля 2002, 12:37:00 »
В общем. Выполняя 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;

может в нем что то не так?
WBR, Creator
more about - CRUA-RIPE

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Mass change in the mySQL base
« Ответ #4 : 09 Апреля 2002, 13:41:18 »
Цитировать
Вот в принципе небольшой скриптик по замене, но я не уверен, что он правильно отработает, а угробить базу мне бы не хотелось:

Сделай 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. :)
« Последнее редактирование: 09 Апреля 2002, 13:46:29 от Chs »
2B OR NOT 2B = FF

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #5 : 09 Апреля 2002, 14:37:11 »
А нифига. Скрипт не отработал. Сказал, что Internal Server Error 500... Что это может быть?

Вот полный скрипт:

#!/usr/bin/perl

$sqlbase = "base_name";
$sqluser = "base_user";
$sqlpass = "base_passwd";
$table = "base_table";

use MySQL;
$db = Mysql->connect(\'localhost\', $sqlbase, $sqluser, $sqlpass);
$get = $db->query("SELECT post_id,topic_id,forum_id,post FROM $table LIMIT 0,5");
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;
WBR, Creator
more about - CRUA-RIPE

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Mass change in the mySQL base
« Ответ #6 : 09 Апреля 2002, 14:54:00 »
Цитировать
Сказал, что Internal Server Error 500... Что это может быть?

Это он сказал, что было бы неплохо логи почитать :)
Поставь после use MySQL;
use CGI::Carp qw(fatalsToBrowser);

ЗЫ. Кстати, а чем DBI так не нравится?
The documentations is your friend

Оффлайн Kostya

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Mass change in the mySQL base
« Ответ #7 : 09 Апреля 2002, 15:08:16 »
Цитировать
Internal Server Error 500

1)в самом начале вставь
print "Content-type: text/html\\n\\n";
2) Возможно скрипт уже и отработал, а ошибка 500 только из-за отсутствия заголовков

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #8 : 09 Апреля 2002, 15:09:45 »
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.
WBR, Creator
more about - CRUA-RIPE

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #9 : 09 Апреля 2002, 15:17:56 »
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!
WBR, Creator
more about - CRUA-RIPE

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Mass change in the mySQL base
« Ответ #10 : 09 Апреля 2002, 15:32:12 »
Цитировать
скоростью работы...
при большом количестве записей скорость работы сиквела несколько высше чем с дби.

Не может этого быть, посколькумодуль MySql реализован через DBI о чем явно написано в документации к нему.:))
Цитировать
кстати, если скрипт работал с начала, с первой записи, где встречалось искомое вхождение, то он все же не отработал!

В логах чего?
use CGI::Carp qw(fatalsToBrowser); - вставил?
2B OR NOT 2B = FF

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #11 : 09 Апреля 2002, 16:12:10 »
логи то я не вижу! :( это надо снова прова дергать!
строку вставил!

Я думаю, ты уже догадался, что речь идет о форуме, а именно о iB3.0.2. Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей. Скажем так, я ему поверил на-слово, так как человек он авторитетный.
WBR, Creator
more about - CRUA-RIPE

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Mass change in the mySQL base
« Ответ #12 : 09 Апреля 2002, 16:21:22 »
Цитировать
строку вставил!

И что происходит?

Цитировать
Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей.

А это я сейчас проверю, только сразу могу сказать - гонит.:)

Желающие подескутировать производительность DBI vsMysql
прошу - http://forums.webscript.ru/showthread.php?s=&threadid=5073
Только с аргументами.:))
2B OR NOT 2B = FF

Оффлайн Creator

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 19
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.unlimit.kiev.ua
Mass change in the mySQL base
« Ответ #13 : 09 Апреля 2002, 22:01:02 »
Цитировать
И что происходит?

дык. а что должно произойти?
вклчается мой обработчик ошибок и выбрасывает \'500error.html\'... т.е. ошибка 500... все так же как и было!

ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?
WBR, Creator
more about - CRUA-RIPE

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Mass change in the mySQL base
« Ответ #14 : 09 Апреля 2002, 22:36:47 »
Цитировать
дык. а что должно произойти?

CGI::Carp должен был выдать ошибку.
FTP, логин и пароль мне на мыло.
Цитировать
ну а на счет гонит, не гонит. Ты эксперементировал? что то получилось?

Гонит. См.  http://forums.webscript.ru/showthread.php?s=&threadid=5073
Это результаты тестов.
2B OR NOT 2B = FF

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28