Есть ли способ найти / заменить строку во всех таблицах в базе данных MySQL? - PullRequest
2 голосов
/ 07 июля 2010

Я думаю, что это невозможно без создания дампа, поиска / замены в файле .sql, а затем его повторного импорта, но я решил все равно спросить ...

В принципе, есть ли способ поиска «samplestring» во всех полях, во всех таблицах, в одной базе данных и заменить его «examplestring»?

Ответы [ 3 ]

2 голосов
/ 07 июля 2010

Я не знаю ни одного.Особенно если вы хотите / хотите посмотреть и изменить имена столбцов и другие элементы, не относящиеся к данным.

Если вам не нужно делать это очень часто, это не так проблематично.

mysqldump --username user --password pass database | sed 's/somestring/otherstring/g' | mysql -uroot -p
1 голос
/ 07 июля 2010

Можно, но для этого нужно использовать динамический SQL ( Подготовленные операторы MySQL ).

Для начала необходимо получить список столбцов на основе текста:

SELECT c.column_name, c.table_name
  FROM INFORMATION_SCHEMA.COLUMNS c
 WHERE c.table_schema = your_db_name
   AND c.data_type IN ('varchar') -- don't want to replace on an INT/etc

Затем вам нужно перебрать этот список, чтобы создать оператор (ы) UPDATE ...

0 голосов
/ 07 сентября 2013

Вот решение в PHP:

<?php

// edit this line to add old and new terms which you want to be replaced
$search_replace = array( 'old_term' => 'new_term', 'old_term2' => 'new_term2' );

//change the localhost,username,password and database-name according to your db
mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("database-name") or die(mysql_error());

$show_tables = mysql_query( 'SHOW TABLES' );
while( $st_rows = mysql_fetch_row( $show_tables ) ) {
    foreach( $st_rows as $cur_table ) {
        $show_columns = mysql_query( 'SHOW COLUMNS FROM ' . $cur_table );
        while( $cc_row = mysql_fetch_assoc( $show_columns ) ) {
            $column = $cc_row['Field'];
            $type = $cc_row['Type'];
            if( strpos( $type, 'char' ) !== false || strpos( $type, 'text' ) !== false ) {
                foreach( $search_replace as $old_string => $new_string ) {
                    $replace_query = 'UPDATE ' . $cur_table .
                        ' SET ' .  $column . ' = REPLACE(' . $column .
                        ', \'' . $old_string . '\', \'' . $new_string . '\')';
                    mysql_query( $replace_query );
                }
            }
        }
    }
}
echo 'replaced';
mysql_free_result( $show_columns );
mysql_free_result( $show_tables );
mysql_close( $mysql_link );

?>

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...