Подтвердить что ты не робот

Обновление значения AUTO_INCREMENT всех таблиц в базе данных MySQL

Можно установить / reset значение AUTO_INCREMENT таблицы MySQL через

ALTER TABLE some_table AUTO_INCREMENT = 1000

Однако мне нужно установить AUTO_INCREMENT по его существующему значению (для исправления репликации M-M), например:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1, который не работает

Ну, на самом деле, я хотел бы запустить этот запрос для всех таблиц в базе данных. Но на самом деле это не очень важно.

Я не мог найти способ справиться с этой проблемой, за исключением запуска запросов вручную. Не могли бы вы предложить что-то или указать мне на некоторые идеи.

Спасибо

4b9b3361

Ответ 1

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

ALTER TABLE some_table AUTO_INCREMENT = 0

... будет reset значение auto_increment будет следующим значением, основанным на самом высоком существующем значении в столбце auto_increment.

Чтобы запустить это по всем таблицам, вам нужно будет использовать динамический синтаксис SQL SQL под названием PreparedStatements, потому что вы не можете предоставить таблицу имя для оператора ALTER TABLE в качестве переменной. Вам нужно будет перебрать вывод из:

SELECT t.table_name
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_schema = 'your_database_name'

... запустив инструкцию ALTER TABLE для каждой таблицы.

Ответ 2

set @db = 'your_db_name';

SELECT concat('ALTER TABLE ', @db, '.', TABLE_NAME, ' AUTO_INCREMENT = 0;') 
FROM information_schema.TABLES WHERE TABLE_SCHEMA = @db AND TABLE_TYPE = 'BASE TABLE'

Затем скопируйте и вставьте полученный результат.

Ответ 3

В приведенных ниже инструкциях вам нужно будет заменить все, что находится в [скобках], с правильным значением. РЕЗЕРВНОЕ КОПИРОВАНИЕ ПЕРЕД ПОПЫТКАМИ.

Если вы можете войти в mysql как root через командную строку, вы можете сделать следующее для reset auto_increment во всех таблицах, сначала мы построим наши запросы, которые мы хотим запустить:

Сделайте резервную копию базы данных:

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]

Логин:

mysql -u root -p

Установите значение group_concat_max_length на большее значение, чтобы наш список запросов не был усечен:

SET group_concat_max_len=100000;

Создайте наш список запросов, используя следующее:

SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]";

Затем вы получите длинную строку запросов mysql, а затем кучу тире. Скопируйте строку запросов в буфер обмена, она будет выглядеть примерно так:

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...

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

USE [DATABASENAME];

Затем вставьте строку, которая находится в вашем буфере обмена, и нажмите enter, чтобы запустить ее. Это должно приводить к изменению в каждой таблице в вашей базе данных.

Перепутано? Восстановите резервную копию, не забудьте выйти из mysql перед запуском следующего (просто введите exit; для этого)

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]

Я не беру на себя ответственность за причиненный ущерб из-за использования вами любой из этих команд, используйте на свой страх и риск.

Ответ 4

Предполагая, что вы должны исправить это, изменив столбец автоматического инкремента, а не внешние ключи в таблице, разложив отношения N: M, и что вы можете подчёрковать правильные значения, попробуйте использовать временную таблицу, соответствующий столбец не является автоматическим приращением, затем сопоставьте это обратно вместо исходной таблицы и затем измените тип столбца на автоматическое приращение или обрезайте исходную таблицу и загрузите данные из таблицы temp.

Ответ 5

Я нашел этот смысл на github, и он работал как прелесть для меня: https://gist.github.com/abhinavlal/4571478

Команда:

mysql -Nsr -e "SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t WHERE t.table_schema = 'DB_NAME'" | xargs -I {} mysql DB_NAME -e "ALTER TABLE {} AUTO_INCREMENT = 1;"

Если ваша БД требует пароль, вы, к сожалению, должны поместить это в команду, чтобы она работала. Одна работа (по-прежнему не велика, но работает) заключается в том, чтобы поместить пароль в безопасный файл. Вы всегда можете удалить файл после того, как пароль не останется в истории команд:

 ... | xargs -I {} mysql -u root -p`cat /path/to/pw.txt` DB_NAME -e...

Ответ 6

Я написал ниже процедуру изменения имени базы данных и выполнил процедуру

CREATE DEFINER=`root`@`localhost` PROCEDURE `setAutoIncrement`()
BEGIN
DECLARE done int default false;
    DECLARE table_name CHAR(255);
DECLARE cur1 cursor for SELECT t.table_name FROM INFORMATION_SCHEMA.TABLES t 
        WHERE t.table_schema = "buzzer_verifone";

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    open cur1;

    myloop: loop
        fetch cur1 into table_name;
        if done then
            leave myloop;
        end if;
        set @sql = CONCAT('ALTER TABLE ',table_name, ' AUTO_INCREMENT = 1');
        prepare stmt from @sql;
        execute stmt;
        drop prepare stmt;
    end loop;

    close cur1;
END

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

Call setAutoIncrement();