可以通过
设置/重置MySQL表的AUTO_INCREMENT
值
ALTER TABLE some_table AUTO_INCREMENT = 1000
但是我需要将AUTO_INCREMENT
设置为其现有值(以修复M-M复制),例如:
ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1
无效
实际上,我想为数据库中的所有表运行此查询。但实际上这并不是非常重要。
除了手动运行查询外,我找不到解决此问题的方法。请你提出一些建议或指出一些想法。
由于
答案 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