更新MySQL数据库中所有表的AUTO_INCREMENT值

par*_*ars 30 mysql replication

可以通过设置/重置AUTO_INCREMENTMySQL表的值

ALTER TABLE some_table AUTO_INCREMENT = 1000

但是我需要设置AUTO_INCREMENT其现有值(以修复MM复制),例如:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1 这是行不通的

实际上,我想对数据库中的所有表运行此查询.但实际上这并不是非常重要.

除了手动运行查询外,我找不到解决此问题的方法.请你提出一些建议或指出一些想法.

谢谢

OMG*_*ies 42

使用:

ALTER TABLE some_table AUTO_INCREMENT = 0
Run Code Online (Sandbox Code Playgroud)

...将auto_increment值重置为auto_increment列中现有最高值的下一个值.

要在所有表上运行此操作,您需要使用名为PreparedStatements的MySQL动态SQL语法,因为您无法将ALTER TABLE语句的表名作为变量提供.你必须循环输出:

SELECT t.table_name
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_schema = 'your_database_name'
Run Code Online (Sandbox Code Playgroud)

...为每个表运行上面的ALTER TABLE语句.

  • 直到并包括MySQL 5.5,[文档](http://dev.mysql.com/doc/refman/5.5/en/alter-table.html)声明:`对于InnoDB,如果该值小于当前最大值列中的值,不会发生错误,并且不会更改当前序列值.从MySQL 5.6开始,[文档](http://dev.mysql.com/doc/refman/5.5/en/alter-table.html )现在声明:`对于InnoDB和MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大AUTO_INCREMENT列值加1. (4认同)

the*_*uts 15

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'
Run Code Online (Sandbox Code Playgroud)

然后复制粘贴并运行您获得的输出.


nic*_*paz 6

在下面的说明中,您需要使用正确的值替换[方括号]中的所有内容.在尝试之前备份.

如果你可以通过命令行以root用户身份登录mysql,那么你可以执行以下操作来重置所有表的auto_increment,首先我们将构建我们想要运行的查询:

进行数据库备份:

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]
Run Code Online (Sandbox Code Playgroud)

登录:

mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

将group_concat_max_length设置为更高的值,以便我们的查询列表不会被截断:

SET group_concat_max_len=100000;
Run Code Online (Sandbox Code Playgroud)

使用以下命令创建我们的查询列表:

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

然后你将收到一串长串的mysql查询,然后是一串破折号.将查询字符串复制到剪贴板,它看起来类似于:

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...
Run Code Online (Sandbox Code Playgroud)

切换到要运行命令的数据库:

USE [DATABASENAME];
Run Code Online (Sandbox Code Playgroud)

然后粘贴剪贴板上的字符串并按Enter键运行它.这应该在数据库中的每个表上运行alter.

弄乱?从备份恢复,请确保在运行以下命令之前注销mysql(只需键入exit;即可)

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]
Run Code Online (Sandbox Code Playgroud)

对于因使用上述任何命令而导致的任何损坏,我将不承担任何责任,使用风险由您自行承担.