MYSQL - перемещение таблиц с определенным префиксом в новую базу данных [duplicate]

Мне легче запомнить, как это работает, тогда я могу выяснить какую-то конкретную комбинацию пуска / остановки / шага.

Поучительно сначала понять range():

def range(start=0, stop, step=1):  # illegal syntax, but that's the effect
    i = start
    while (i < stop if step > 0 else i > stop):
        yield i
        i += step

Начните с start, приращение на step, не достиг stop. Очень просто.

Вещь, которую следует помнить об отрицательном шаге, заключается в том, что stop всегда является исключенным концом, будь то выше или ниже. Если вы хотите, чтобы один и тот же срез находился в противоположном порядке, намного проще делать разворот отдельно: например. 'abcde'[1:-2][::-1] срезает один символ слева, два справа, затем меняет направление. (См. Также reversed() .)

Последовательность разреза такая же, за исключением того, что она сначала нормализует отрицательные индексы и никогда не может выйти за пределы последовательности:

TODO : В приведенном ниже коде была ошибка с «никогда не выходить за пределы последовательности», когда abs (шаг)> 1; Я думаю, Я исправил его правильно, но это трудно понять.

def this_is_how_slicing_works(seq, start=None, stop=None, step=1):
    if start is None:
        start = (0 if step > 0 else len(seq)-1)
    elif start < 0:
        start += len(seq)
    if not 0 <= start < len(seq):  # clip if still outside bounds
        start = (0 if step > 0 else len(seq)-1)
    if stop is None:
        stop = (len(seq) if step > 0 else -1)  # really -1, not last element
    elif stop < 0:
        stop += len(seq)
    for i in range(start, stop, step):
        if 0 <= i < len(seq):
            yield seq[i]

Не беспокойтесь о деталях is None - просто помните, что опускание start и / или stop всегда делает правильную вещь, чтобы дать вам целую последовательность.

Нормализовать отрицательные индексы сначала позволяет запускать и / или останавливаться, чтобы считаться с конца независимо: 'abcde'[1:-2] == 'abcde'[1:3] == 'bc', несмотря на range(1,-2) == [] , Нормализацию иногда называют «по модулю длины», но обратите внимание, что она добавляет длину только один раз: например. 'abcde'[-53:42] - это целая строка.

0
задан user1550338 25 July 2012 в 03:52
поделиться

4 ответа

Использовать ниже хранимой процедуры ::

DELIMITER $$

CREATE

PROCEDURE `Rename_Tables`()

BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tableName VARCHAR(50);
DECLARE newTableName VARCHAR(70);
DECLARE t_query VARCHAR(500);
DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%table_test' AND table_schema='test' ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;

read_loop: LOOP
    FETCH cur1 INTO tableName;
    IF done THEN
        LEAVE read_loop;
    END IF;
    SET newTableName = SUBSTRING(tableName, 1,LOCATE('_',tableName)-1);
    SET t_query = CONCAT('RENAME TABLE ', tableName, ' TO ', newTableName);

    SET @myQuery = t_query;
    PREPARE stmt FROM @myQuery;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END LOOP;

END$$

DELIMITER;

Заменить table_schema своим именем table_schema.

3
ответ дан hemu 24 August 2018 в 17:20
поделиться

Например:

select group_concat(v.name SEPARATOR ' ') 
from (
      select concat('rename table ', t.table_name, ' to ', substring(reverse(v.name), instr(reverse(v.name), '_') + 1, length(v.name)) name 
      from information_schema.tables t
      where 
          table_schema = 'put_your_table_schema'
          and table_name like '%_test'
     ) v;
  1. Запуск этого запроса приведет к выполнению сценария, который должен быть выполнен для переименования таблиц.
  2. substring(reverse.....) вместо простого replace(v.name, '_test', '') используется потому что мы должны быть уверены, что мы заменим только вхождения _test только в конце строки.

Надеюсь, что это поможет

0
ответ дан ravnur 24 August 2018 в 17:20
поделиться

Я хотел обновить то, что сработало для меня, поскольку этот пост довольно старый. Мне нужно было добавить знак до и после имен таблиц. И не забудьте добавить последнее; потому что это иногда может вызывать синтаксическую ошибку.

SET group_concat_max_len=5000;
SELECT group_concat(v.name separator '; ')
FROM (
    SELECT concat('RENAME TABLE `', t.table_name, '` TO `', replace(t.table_name, 'wp_', 'wplocal_'), '`') name
    FROM information_schema.tables t
    WHERE table_name like 'wp_%'
) v;
0
ответ дан SouthernBoy 24 August 2018 в 17:20
поделиться

Небольшая модификация ответа @ ravnur:

SET group_concat_max_len=5000;
SELECT group_concat(v.name separator '; ')
FROM (
    SELECT concat('RENAME TABLE ', t.table_name, ' TO ', replace(t.table_name, 'wp_', 'blog_')) name
    FROM information_schema.tables t
    WHERE table_name like 'wp_%'
) v;

Полезно, если вы хотите переименовать свои таблицы Wordpress из префикса по умолчанию от wp_ до blog_ (например). Скопируйте и вставьте вывод этой команды в оболочку mysql или phpMyAdmin.

0
ответ дан Waddles 24 August 2018 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: