如何使用另一个表中的 MAX 值重置 MySQL 自动增量?
我知道这行不通。我尝试过各种形式,但每次都失败。实现以下结果的最简单方法是什么?
ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC);
这对于自动化项目来说非常有用。
SELECT @max := (max(ID)+1) from ABC; -> This works!
select ID from ABC where ID = (@max-1); -> This works!
ALTER TABLE XYZ AUTO_INCREMENT = (@max+1); -> This fails :( Why?
I know this won't work. I tried it in various forms and failed all times. What is the simplest way to achieve the following result?
ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC);
This is great for automation projects.
SELECT @max := (max(ID)+1) from ABC; -> This works!
select ID from ABC where ID = (@max-1); -> This works!
ALTER TABLE XYZ AUTO_INCREMENT = (@max+1); -> This fails :( Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
使用准备好的语句:
Use a prepared statement:
按照 MySQL 文档,这有效对于 MySQL 5.7 中的我来说:
Following the MySQL documentation, this worked for me in MySQL 5.7:
如果遇到 PREPARE stmt FROM 'ALTER TABLE XYZ AUTO_INCRMENT = ?' 问题,可以使用:
Whoever is having a problem with PREPARE stmt FROM 'ALTER TABLE XYZ AUTO_INCREMENT = ?' can use:
我正在为我的应用程序的新版本创建自动数据库转换脚本。
在一个表中,我需要将主自动增量字段更改为不同的字段。由于此页面在我用谷歌搜索解决方案时多次出现,因此这里有一个最终对我有用的解决方案:
I'm creating an automated database transformation script for a new version of my application.
In one table, I needed to change the primary auto-increment field to a different field. Since this page came up first many times while I googled a solution for it, here's a solution that eventually worked for me:
重置自动增量 ID。
重置自动增量 ID
根据数据库中的当前值将数据库中的所有自动增量列更新为可能的最小值。我们需要在清理数据库后执行此操作。
在 存储过程:
Reset Auto Increment IDs.
Reset Auto Increment IDs
Update all auto increment columns in a database to the smallest possible value based on current values in the databases. We needed to do this after cleaning out a database.
Use a prepared statement within a stored procedure:
就我个人而言,我可能会使用 shell 脚本或小型 C#/C++ 应用程序或 PHP/Ruby/Perl 脚本在 2 个查询中执行此操作:
SELECT MAX(ID) FROM ABC;
ALTER TABLE XYZ AUTO_INCRMENT = <插入从第一个查询中检索到的值>
显然要小心,新的自动增量不会导致与<中的现有数据发生任何键冲突。代码>XYZ表。
Personally I'd probably use either a shell script or a little C#/C++ application or PHP/Ruby/Perl script to do this in 2 queries:
SELECT MAX(ID) FROM ABC;
ALTER TABLE XYZ AUTO_INCREMENT = <insert value retrieved from first query here>
Obviously being careful that the new auto increment won't cause any key clashes with existing data in the
XYZ
table.好的,伙计们。我想出了一个不太直观的解决方案。最好的部分是它有效!
Ok guys. I have come up with a not so intuitive solution. The best part is that it works!
如果你真的想单独在 MySQL 中执行此操作,你可以将动态构建的 alter 命令转储到磁盘上的文件中,然后执行它。
就像这样:
If you really want to do this in MySQL alone, you can just dump the dynamically built alter command to a file on disk and then execute it.
Like so: