可以通过
设置/重置MySQL表的
AUTO_INCREMENT
值
ALTER TABLE some_table AUTO_INCREMENT = 1000
但是我需要根据其现有值设置
AUTO_INCREMENT
(以修复 M-M 复制),例如:
ALTER TABLE some_table SET AUTO_INCREMENT = AUTO_INCREMENT + 1
不起作用
实际上,我想对数据库中的所有表运行此查询。但其实这并不是很重要。
除了手动运行查询之外,我找不到解决此问题的方法。您能提出一些建议或给我指出一些想法吗?
谢谢
使用:
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 语句。
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'
然后复制粘贴并运行得到的输出。
在下面的说明中,您需要将 [括号] 中的所有内容替换为正确的值。 尝试之前进行备份。
如果您可以通过命令行以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]
对于您使用任何这些命令造成的任何损害,我不承担任何责任,使用风险由您自行承担。
我在 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...
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();
确保
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