2010-03-17 1 views
22

Мой провайдер установлен на моем сайте Drupal CMS. Теперь мне нужно скопировать все мои данные со старого сайта. У меня есть таблицы без префиксов в моей старой БД, но в новой БД все таблицы имеют префикс dp_[table_name].Как я могу изменить префиксы во всех таблицах в моей базе данных MySQL?

ответ

26

Решение zerkms не работает для меня. Мне нужно было указать базу данных information_schema, чтобы иметь возможность запрашивать таблицу Tables.

SELECT 
    CONCAT('RENAME TABLE ', GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`')) AS q 
FROM 
    `information_schema`.`Tables` WHERE TABLE_SCHEMA='test'; 

Edit:

Оптимизированный запрос только вызова RENAME TABLE один раз. Что-то, во что я вошел, было то, что конкатенированный выход уселся на 341 символ. Это может быть решена (если это разрешено сервером), установив переменную MySQL group_concat_max_len на более высокое значение:

SET group_concat_max_len = 3072; -- UTF8 assumes each character will take 3 bytes, so 3072/3 = 1024 characters. 
+0

Правда, это сработало для меня с тех пор, как я работал над localhost XAMPP с помощью Joomla, и я хотел перейти на автоматический префикс Joomla. Я следую вашим шагам - мне нужно было указать 'information_schema'''Tables', как вы это делали, и установить SET group_concat_max_len = 10240; в моем случае, так как было много таблиц. +1 – MJoraid

+1

Еще одна точка, вы можете использовать ту же команду для перемещения таблицы через базы данных (например, backup_db), например: 'SELECT CONCAT ('RENAME TABLE', TABLE_NAME, 'to backup_db.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA. TABLES WHERE table_schema = 'testbot'; ' – sactiw

+0

отличная точка редактирования переменной' group_concat_max_len'! Я тоже не получил полного предложения, отлично работал! – AlexGH

21

написать сценарий, который будет запускать RENAME TABLE для каждой таблицы.

SELECT 
    GROUP_CONCAT('RENAME TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` TO `', TABLE_SCHEMA, '`.`prefix_', TABLE_NAME, '`;' SEPARATOR ' ') 
FROM 
    `TABLES` WHERE `TABLE_SCHEMA` = "test"; 

где «тест», как ожидается, имя базы данных

после этого вы можете долго запрос, который будет добавлять префиксы, если вы выполняете это ;-)

3

Вы можете просто дамп базы данных, открыть дамп с текстовым редактором, замените все вхождения «CREATE TABLE» на «CREATE TABLE dp_» и восстановите базу данных. Это займет пару минут.

+2

до тех пор, пока база данных не будет иметь пару гигабайт ;-) – zerkms

+0

Я играю. :) Для баз данных, больших GB, используйте инструмент запроса (например, SQL Workbench), выберите все таблицы в списке таблиц, скопируйте содержимое в столбец A таблицы (в моем случае Calc) и поместите следующие формула в столбце B: = «переименовать таблицу» & A1 & «to dp_» & A1 & "; «Вставить формулу из ячейки B1 в каждую другую ячейку столбца B, а сценарий переименования появится в столбце B! –

+0

, как я сказал в своем ответе - подходящим способом переименования является использование RENAME TABLE (+ information_shema для извлечения имен таблиц) – zerkms

10

PhpMyAdmin позволяет сделать это сейчас. На уровне «База данных» выберите вкладку «Структура», чтобы просмотреть все таблицы. Нажмите «Проверить все» (ниже списка таблиц). В раскрывающемся списке «С выбранным» выберите: «Заменить префикс таблицы».

Смежные вопросы