mysql删除,自动增量

时间:2012-11-30 11:02:47

标签: mysql sql

我在MySQL中使用InnoDB有一个表,其中一个列的名称为“id”。

所以我的问题是每当我从表中删除最后一行然后插入一个新值时,新值就会在删除的id之后插入。

我的意思是假设我的id是32,我想删除它,然后如果我在删除后插入一个新行,那么列id自动递增到33.所以串行格式被破坏,即id = 30, 31,33和没有32。

因此,在删除最后一栏后插入时,请帮我分配ID 32而不是33。

4 个答案:

答案 0 :(得分:16)

简短回答:不。

为什么?

  1. 这是不必要的工作。如果序列号中存在间隙,则无关紧要。
  2. 如果您不想这样,请不要使用auto_increment。
  3. 请不要担心,如果您的列属于int类型甚至是bigint,您将不会用完数字,我保证。
  4. 当您删除行时,MySQL没有自动降低自动增量值的原因。原因是
    • 数据完整性破坏的危险(假设多个用户执行删除或插入...可能会发生加倍或更糟的条目)
    • 使用主从复制或事务时可能会发生
    • 错误
    • 等......
  5. 高度建议您不要浪费时间!这真的非常容易出错。

答案 1 :(得分:4)

关于关系数据库的工作原理,你有两个主要的误解:

  1. 在关系数据库中没有“最后一行”这样的东西。
  2. ID(假设这是您的主键) no 具有任何意义。如果为新行分配了33,35354或236532652632,则无关紧要。这只是唯一标识该行的值。
  3. 不要依赖主键列中的连续值。

    不要尝试max(id)+1方法。它将无法在具有多个事务的系统中工作。

答案 2 :(得分:3)

你应该停止对抗这一点,即使使用SELECT max(id)使用像Innodb这样的事务数据库引擎也无法正确解决这个问题。

为什么你会问?想象一下,你有两个交易,A和B,几乎同时开始,都做INSERT。第一个事务A需要新行id,并且它将从与此表关联的不可见序列(称为AUTOINCREMENT值)中使用它,例如21.另一个事务B将使用另一个连续值(比如22) - 到目前为止好。

但是,如果交易A回滚怎么办?值21无法重用,22已经提交。如果有10个这样的交易怎么办?

并且max(id)可以为A和B分配相同的值,因此这也是无效的。

答案 3 :(得分:0)

我想你的意思是“每当我删除表格的最后一行”时,不是吗?

无论如何,这就是自动增量的工作原理。这是为了保持正确的数据关系。如果在另一个表中使用已删除的记录的id,则在查询该id时获取错误更为正确,而不是获取另一条记录。

无论如何here你可以看到如何获得字段中的第一个免费ID。