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

时间:2010-08-29 16:37:12

标签: mysql replication

可以通过

设置/重置MySQL表的AUTO_INCREMENT

ALTER TABLE some_table AUTO_INCREMENT = 1000

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

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1无效

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

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

由于

8 个答案:

答案 0 :(得分:42)

使用:

ALTER TABLE some_table AUTO_INCREMENT = 0

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

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

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

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

答案 1 :(得分:14)

set @db = 'your_db_name';

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

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

答案 2 :(得分: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键运行它。这应该在数据库中的每个表上运行alter。

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

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

对于因使用上述任何命令而造成的任何损害,我不承担任何责任,使用风险自负。

答案 3 :(得分:1)

假设您必须通过修改自动增量列而不是分解N:M关系的表中的外键来修复此问题,并且您可以修改正确的值,请尝试使用临时表,其中相关列不是自动递增,然后将其映射回原始表,并将列类型更改为自动递增,或者截断原始表并从临时表中加载数据。

答案 4 :(得分: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...

答案 5 :(得分: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();

答案 6 :(得分:-1)

重置mysql表auto_increment非常简单,我们可以通过单个查询来完成,请参阅此http://webobserve.blogspot.com/2011/02/reset-mysql-table-autoincrement.html

答案 7 :(得分:-1)

在MySQL数据库中更新/重置AUTO_INCREMENT的最快解决方案

确保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