1

Тема: Копирование таблиц в одной базе

Имеется база base_db, в ней таблицы pre1_tab1, pre1_tab2, pre1_tab3...pre1_tabn. Как скопировать эти таблицы в эту же базу base_db, только с другим префиксом pre2_tab1, pre2_tab2, pre2_tab3...pre2_tabn ? Каждую по очереди я нашел, как скопировать, но это очень долго... А все сразу скопировать, изменив только префикс, есть возможность?

2

Re: Копирование таблиц в одной базе

Эту процедуру можно запустить на БД для смены префиксов таблиц.
Параметры: old_prefix - старый префикс, new_prefix - новый префикс.

DROP PROCEDURE IF EXISTS `copy`//
CREATE DEFINER=`root`@`localhost` PROCEDURE `copy`(IN old_prefix VARCHAR(20), IN new_prefix VARCHAR(20))
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE table_name VARCHAR(40);
  DECLARE new_table_name VARCHAR(40);
  DECLARE table_postfix VARCHAR(40);
  DECLARE cur1 CURSOR FOR SHOW TABLES;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur1;

  REPEAT
    FETCH cur1 INTO table_name;
    SET table_postfix = TRIM(LEADING old_prefix FROM table_name);
    SET new_table_name = CONCAT(new_prefix, table_postfix);
    IF NOT done THEN
      IF table_name LIKE CONCAT(old_prefix, '%') THEN
        SET @S := CONCAT('CREATE TABLE `', new_table_name, '` LIKE `', table_name, '`;' );
        PREPARE stmt FROM @S;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

        SET @S := CONCAT('INSERT INTO `', new_table_name, '` SELECT * FROM `', table_name, '`;');
        PREPARE stmt FROM @S;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
      END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;

END

Пример вызова процедуры:

CALL copy('old_prefix', 'new_prefix');

3

Re: Копирование таблиц в одной базе

А можно таким образом проставить префиксы.
И вопрос по коду:
код вставить в поле "Выполнить SQL запрос(ы) на БД",
а потом туда же Вызов процедуры....
Или я, в силу ограниченности smile чего-то не понял?

Ответ есть всегда, главное вопрос правильно поставить!)

4

Re: Копирование таблиц в одной базе

givchik
Совершенно верно: код необходимо вставить в поле выполнения SQL запроса и затем вызвать процедуру через CALL. Добавить префиксы можно так:

CALL copy('', 'new_prefix');

Процедура может не создаться и вывести ошибку, так что проверьте.

5

Re: Копирование таблиц в одной базе

Протестирую и отпишусь чтоб глупые вопросы не задавать smile .

Ответ есть всегда, главное вопрос правильно поставить!)