Как удалить префикс имени из каждого имени таблицы в базе данных MySQL - PullRequest
4 голосов
/ 19 июня 2011

У меня есть база данных joomla mysql с префиксом имени таблицы "jos_" во всех именах таблиц.Но я хотел бы удалить его из всех моих таблиц.Я понимаю, как переименовывать каждую таблицу по одной, но у меня есть 600 таблиц.Есть ли легко выполнить SQL-запрос для этого.

Если у кого-то есть решение, не могли бы вы опубликовать точный SQL-запрос, который я могу использовать?

Ответы [ 3 ]

14 голосов
/ 19 июня 2011

Вы можете сгенерировать необходимые операторы с помощью одного запроса:

select 'RENAME TABLE ' || table_name ||  ' TO ' || substr(table_name, 5) ||';'
from information_schema.tables

Сохраните выходные данные этого запроса в файл, и у вас есть все необходимые операторы.

Или, если этовозвращает 0 с и 1 с, а не состояния, вот версия вместо concat:

select concat('RENAME TABLE ', concat(table_name, concat(' TO ', concat(substr(table_name, 5), ';'))))
from information_schema.tables;
12 голосов
/ 15 августа 2013
  1. В phpmyadmin выберите все таблицы вашей базы данных.
  2. Из раскрывающегося списка 'С выбранным:' выберите 'Заменить префикс таблицы'
  3. Установить с -> на замена.
  4. ВЫПОЛНЕНО
3 голосов
/ 20 июня 2011

Вы можете создать собственную хранимую процедуру для переименования ваших таблиц, при этом вам не нужно открывать внешний редактор, все будет сделано на сервере:

delimiter //
CREATE PROCEDURE rename_tables( IN db CHAR(255), IN srch CHAR(255), IN rplc CHAR(255) )
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE from_table CHAR(255);
  DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=db;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur1;

  read_loop: LOOP
    IF done THEN
      LEAVE read_loop;
    END IF;

    FETCH cur1 INTO from_table;
    SET @to_table = REPLACE(from_table, srch, rplc);

    IF from_table != @to_table THEN
      SET @rename_query = CONCAT('RENAME TABLE ', db, '.', from_table, ' TO ', @to_table, ';');

      PREPARE stmt FROM @rename_query;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END IF;

  END LOOP;

  CLOSE cur1;
END//
delimiter ;

Использование:

CALL rename_tables('test', 'jos_', '');

Обновление: Это была моя первая хранимая процедура MySQL, и я столкнулся с 6-летней старой ошибкой # 5967 , которая довольно раздражала, имена ваших переменных должны отличаться от имен полей, потому что в противном случае вы получите NULL значения в ваших переменных.

Так что помните об этом, если вы решите написать хранимую процедуру MySQL.

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