【问题标题】:Auto Increment Problem in MysqlMysql中的自动增量问题
【发布时间】:2011-07-12 20:46:59
【问题描述】:

我创建了一个表并设置了一个字段来自动增加这样的东西:

CREATE TABLE t1(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE = MyISAM AUTO_INCREMENT = 123456; 

但由于某种原因,我删除了表中的一些行。

现在的问题是,当我在表中插入新行时,应该为新行分配已删除行的 id,而不是分配新的 id。

我不想重置所有的id

我该怎么做??

帮助表示赞赏:)

【问题讨论】:

  • 您可以重置自动增量编号,但您确实不需要这样做。非线性id应该没有问题吧?
  • 嘿抱歉我之前没有提到我不想重置..
  • 等等。您有一个自动增量字段。它开始一个上限。您希望它以较低的数字继续。但你不想重置它?请注意,我的意思是重新设置。不将其重置为 0 本身。只需将其重置为您想要的任何内容....

标签: mysql


【解决方案1】:

很抱歉,这不是AUTO_INCREMENT.的使用如果你想重用id,那么你必须编写自己的触发函数,这样做通常被认为是不好的做法。

假设您在 id 50,000 上删除了一个 id 为 1 的条目...您真的希望添加的下一条记录重新使用 id 1 吗?

【讨论】:

    【解决方案2】:

    AUTO_INCREMENT 的全部意义在于自动递增...

    您可以显式分配这些 id,mysql 将允许它。

    【讨论】:

      【解决方案3】:

      您将不得不手动执行此操作,而不是依赖 MySQL 为您执行此操作。 AUTO-INCREMENT 标志保留一个整数,该整数在每个插入语句时递增,并分配为后续插入的 PK。除非您想编写一个更新触发器来将此值重置为最低的未使用整数,否则我建议您使用服务器端脚本语言来处理它。

      但是,无论如何,为什么使用自动增量值是个问题?

      【讨论】:

        【解决方案4】:

        要重置自动增量值,您可以使用

        ALTER TABLE t1 AUTO_INCREMENT=1
        

        下一个插入的记录将使用 ID 1。

        【讨论】:

        • 其实下一个ID就是(表中最大的ID)+1。
        • 没有。设置AUTO_INCREMENT的目的是为了改变下一个生成的值。
        • 你的目的是对的,当然。但我的评论是关于实际会发生什么。您编写的语句“ALTER TABLE t1 AUTO_INCREMENT=1”将仅在表为空的情况下将 auto_increment 计数器重置为 1。如果表中有任何记录(原始问题中的情况),则在执行您的语句后,如果它是 MyISAM,计数器将设置为 {[the maximum ID there is in the table] + 1}。对于 InnoDB,auto_increment 的值不会改变。参考官方文档:dev.mysql.com/doc/refman/5.1/en/alter-table.html
        • 实际上,对于 MyISAM 和 InnoDB,如果您选择的值高于定义的最大 ID,您可以更改 AUTO_INCREMENT 值。但是,这显然不能解决 OP 的问题。
        【解决方案5】:

        这可能是你所追求的。

        alter table Users AUTO_INCREMENT=0;

        这会将auto_increment 重置回0 +,无论当前最高ID 是多少。

        如果您有30,您的下一个条目将是31

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-02
          • 1970-01-01
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          相关资源
          最近更新 更多