Замяна на даден низ във всички таблици на 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 на базата и преглеждане, могат да се изпълнят за постигане на желания ефект.
Няма коментари
Обратно към списъка със статиите
Тази страница последно е променяна на 2025-04-29 21:02:51