【问题标题】:MySQL: Resetting AUTO_INCREMENTMySQL:重置 AUTO_INCREMENT
【发布时间】:2013-03-22 21:41:45
【问题描述】:

我正在尝试根据其中一个表中当前的行数来重置其中一个表中的自动增量值。这是我到目前为止的代码。

SET @numrows = 0;

SELECT COUNT(*) total, @numrows := COUNT(*) + 1 numrows FROM maj_user ;
ALTER TABLE `maj_user` AUTO_INCREMENT = @numrows ;

如果我在 MySQL Workbench 中执行它,这将非常有用。但是,我需要将其保存为 SQL 文件并将其作为数据库导入脚本的一部分执行。如果我这样做,我会得到:

ERROR 1064 (42000) at line 39: You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right syntax to
use near '@numrows' at line 1

第 39 行是 ALTER TABLE 语句。有什么想法吗?

【问题讨论】:

  • 您不应该将AUTO_INCREMENT 值设置为IFNULL(MAX(id),0)+1 或您的自动递增列吗?侥幸它可能与行数相同,但这绝不是可靠的。
  • 在典型情况下,是的。在这种特殊情况下,MAX 和 COUNT 相等的概率是确定的。
  • 所以你从来没有,曾经删除行?那么你的AUTO_INCREMENT 是如何进入错误状态的呢?
  • 此应用程序的早期部分从表末尾删除最后 x 条记录,留下一组从 id #1 开始的特殊记录,这些记录永远不会被删除。是的,它确实删除了,但总是相同的集合。我可以使用我提出的问题的解决方案。让我们继续回答旨在解决问题的问题。
  • 只是想更好地了解您的要求。

标签: mysql


【解决方案1】:

您可以更改语法以跳过实际设置@numrows 吗?我不确定问题是什么,但解决方法似乎是这样的:

ALTER TABLE `maj_user` AUTO_INCREMENT = (SELECT COUNT(*) + 1 from maj_user);

【讨论】:

  • 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“(SELECT COUNT(*)+ 1 from maj_user)”附近使用正确的语法
  • 出于性能原因,您应该在计数语句中使用主键而不是 *。
  • 你可以在两个查询中执行此操作,一个用于获取,一个用于调整,如果您不太担心可能会在开始操作之前插入记录的竞争条件,或者您'准备短暂锁定表。
  • 这声称将其设置为 0 实际上会使它比表中的最大值高 1。由于无法验证,我会先创建一个测试表,然后再将其用于您的实际表:stackoverflow.com/questions/3595584/…
猜你喜欢
  • 2017-04-14
  • 2013-12-22
  • 2015-04-15
相关资源
最近更新 更多