Замяна на даден низ във всички таблици на MySQL база данни

 

Когато се променя домейна на даден сайт или при други подобни операции, се налага даден низ да се замени в цялата база. Не в дадена таблица и колона, а във всички текстови колони във всички таблици в базата данни.


Едно просто решение


Този ефект може да се постигне чрез експортиране на базата в текстов файл, редактиране на файла с текстов редактор, и обратно импортиране на базата. За съжаление при много големи бази файлът може да достигне няколко гигабайта, което прави операциите доста сложни. В такива случаи може да се изпълнят на ръка няколко SQL заявки, които ползват функцията replace(). Ако базата е от само няколко таблици, то тези заявки могат да се напишат на ръка. Ако обаче имаме база от стотици таблици с десетки текстови колони е нужно да потърсим автоматизирано решение.


Автоматично генериране на заявки на база INFORMATION_SCHEMA


Ето едно друго решение, което използва INFORMATION_SCHEMA за да открие кои колони имат нужда от модификация. INFORMATION_SCHEMA е системна база данни, която съдържа мета данните на всички таблици и други обекти. Тук ще използваме TABLES и COLUMNS псевдо таблиците. Първата съдържа информация за всички таблици във всички база данни на сървъра, а втората - информация за техните колони. Първо ще определим списъка от таблици в нашата база данни, после за всяка от тях ще намерим текстовите колони от тип TEXT и VARCHAR, и накрая ще генерираме необходимите заявки. Ето и кода:

<?php

function generate_queries($database, $user, $password, $host, $search, $replace) {

    $conn = mysql_connect($host, $user, $password);
    if (!$conn) {
        die('Unable to connect ' . mysql_error());
    }
   
    if (!mysql_select_db('INFORMATION_SCHEMA', $conn)) {
        die('Cannot use INFORMATION_SCHEMA');
    }
   
    $database_sql = mysql_real_escape_string($database, $conn);
    $query_tables = "select TABLE_NAME from TABLES where TABLE_SCHEMA = '$database_sql'";
    $tables_res = mysql_query($query_tables);
   
    $queries = '';
    $search_sql = mysql_real_escape_string($search, $conn);
    $replace_sql = mysql_real_escape_string($replace, $conn);
   
    while($tables_row = mysql_fetch_assoc($tables_res)) {
        $table_sql = mysql_real_escape_string($tables_row['TABLE_NAME'], $conn);
       
        $query_columns = "select COLUMN_NAME from COLUMNS where TABLE_SCHEMA = '$database_sql' and TABLE_NAME = '$table_sql' and DATA_TYPE in ('varchar', 'text')";
        $columns_res = mysql_query($query_columns);
        $columns = array();
        while ($column_row = mysql_fetch_assoc($columns_res)) {
            $columns[] = $column_row['COLUMN_NAME'];
        }
       
        if (!empty($columns)) {
            $queries .= "update `{$tables_row['TABLE_NAME']}` set ";
            foreach ($columns as $i => $column) {
                if ($i) {
                    $queries .= ", ";
                }
                $queries .= "`$column` = replace(`$column`, '$search_sql', '$replace_sql')";
            }
            $queries .= ";\n";
        }
    }
   
    return $queries;
}


Функцията връща списък от заявки, които след backup на базата и преглеждане, могат да се изпълнят за постигане на желания ефект.

 

Няма коментари

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-04-20 16:55:29