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

问题描述 投票:0回答:8

可以通过

设置/重置MySQL表的
AUTO_INCREMENT

ALTER TABLE some_table AUTO_INCREMENT = 1000

但是我需要根据其现有值设置

AUTO_INCREMENT
(以修复 M-M 复制),例如:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1
不起作用

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

除了手动运行查询之外,我找不到解决此问题的方法。您能提出一些建议或给我指出一些想法吗?

谢谢

mysql replication
8个回答
53
投票

使用:

ALTER TABLE some_table AUTO_INCREMENT = 0

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

要对所有表运行此操作,您需要使用 MySQL 的动态 SQL 语法(称为“PreparedStatements”),因为您无法将 ALTER TABLE 语句的表名作为变量提供。 您必须循环以下输出:

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

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


33
投票
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'

然后复制粘贴并运行得到的输出。


6
投票

在下面的说明中,您需要将 [括号] 中的所有内容替换为正确的值。 尝试之前进行备份。

如果您可以通过命令行以root身份登录mysql,那么您可以执行以下操作来重置所有表上的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]

对于您使用任何这些命令造成的任何损害,我不承担任何责任,使用风险由您自行承担。


1
投票

我在 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...



1
投票


0
投票

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();



-1
投票
在 MySQL 数据库中更新/重置 AUTO_INCRMENT 的最快解决方案

确保

AUTO_INCREMENT

列尚未用作另一个表上的

FOREIGN_KEY
首先,将 

AUTO_INCREMENT

列删除为:

ALTER TABLE table_name DROP column_name

示例:
ALTER TABLE payments DROP payment_id

然后重新添加该列,并将其移动为表格中的第一列

ALTER TABLE table_name ADD column_name DATATYPE AUTO_INCREMENT PRIMARY KEY FIRST

示例:
ALTER TABLE payments ADD payment_id INT AUTO_INCREMENT PRIMARY KEY FIRST

    


-2
投票
http://webobserve.blogspot.com/2011/02/reset-mysql-table-autoincrement.html

© www.soinside.com 2019 - 2024. All rights reserved.