2010-08-29 75 views
23

据possbile设置/通过更新AUTO_INCREMENT值

ALTER TABLE some_table AUTO_INCREMENT = 1000

重置MySQL表的AUTO_INCREMENT值。然而,我需要在它的现有值来设置AUTO_INCREMENT(固定MM复制),是这样的:

ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1这是不工作

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

我找不到解决这个问题的方法,只能手动运行查询。请你提出一些建议或指出我的想法。

感谢

+0

这不是工作,以及: 'ALTER TABLE my_db.customer AUTO_INCREMENT =(SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA。WHERE table_name ='customer')' – pars 2010-08-29 17:32:01

+0

由于您提到了M-M复制:是否真的需要触摸AUTO_INCREMENT以使复制工作?我通常只需在my.cnf中设置自动增量增量和自动增量偏移值。 – faxi05 2010-08-29 17:34:58

+0

@ faxi05是的,你是对的。我也有相同的配置工作正常。但是为了在硬件故障后重新同步两个数据库,我不得不从一个数据库转储所有数据并将其导入另一个数据库。在这个过程中有一些错误。令人惊讶的是,没有我做任何事情,他们都走了。 – pars 2010-08-29 20:38:40

回答

36

使用:

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语句。

+0

'ALTER TABLE some_table AUTO_INCREMENT = 0'没有按预期工作。另一方面,我可能还需要显式设置auto_increment值。就像增加9个一样。 这件事情变得越来越复杂。我怀疑我的方向是错误的。也许我应该找到另一种方式。 – pars 2010-08-29 20:31:55

+1

@celalo:我不同意'AUTO_INCREMENT = 0'不起作用 - 我在发布之前自己测试了一下:我添加了三条记录,在插入第四条记录之前将auto_increment更新为100。删除ID值为100的记录,然后在插入第五条记录之前运行“AUTO_INCREMENT = 0”。插入的记录高于现有的第三条记录。 – 2010-08-29 20:39:31

+2

至多并包括MySQL 5.5,[documentation](http://dev.mysql.com/doc/refman/5.5/en/alter-table.html)陈述:'对于InnoDB,如果该值小于当前值列中的最大值,不会发生错误,并且当前的序列值不会更改。“从MySQL 5.6开始,[documentation](http://dev.mysql.com/doc/refman/5.5/en/alter-table。 html)现在声明:'对于InnoDB和MyISAM,如果该值小于或等于当前AUTO_INCREMENT列中的最大值,则将该值重置为当前的最大AUTO_INCREMENT列值加1。“#” – vladr 2014-05-13 18:52:41

1

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

5

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

如果您可以登录通过命令行来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]; 

然后粘贴是在弦上你的剪贴板并按回车来运行它。这应该在数据库中的每个表上运行alter。

搞砸了吗?从备份中恢复,确保运行以下之前注销的MySQL(只需输入exit;这样做)

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

我不会把你使用这些命令的任何损坏原因的责任,在使用你自己的风险。

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(); 
4
set @db = 'your_db_name'; 

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

然后复制,粘贴和运行输出你得到。

+1

这工作得很好,使用起来非常简单。切记:不要忘记用您的实际数据库名称先替换your_db_name! – 2017-10-24 19:40:46

0

我发现在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... 
相关问题