【问题标题】:Add +1 to last entry with PHP/MySQL (auto-increment) [duplicate]使用 PHP/MySQL 将 +1 添加到最后一个条目(自动增量)[重复]
【发布时间】:2012-10-19 19:31:28
【问题描述】:

可能重复:
How to fill in the “holes” in auto-incremenet fields?

我们目前正在对条目不断进出的表使用自动增量。这样做的问题是,最终自动增量 id 会变得很大,因为这就是自动增量的工作原理。

我们希望它始终为最后一个条目添加 +1。

例如:
我们有 4 个条目,id 4 被删除。下一个添加的条目应该得到 id 4,而不是 5。

我不确定以前是否有人问过这个问题。但是在搜索之后,我只能找到关于如何获得下一个自增数的解决方案,这根本不是我想要的。

【问题讨论】:

  • 自增有什么问题?
  • 我强烈反对这种方案。如果您重复使用 id,您最终可能会引用错误的行,而不是损坏的引用。调试起来非常困难,并且可能导致安全漏洞。
  • 自动增量值有什么问题?它就是为此而设计的,无论它变得多么“巨大”;并且使用最后一个条目 + 1 “滚动你自己的”会给你带来不断的问题
  • 你能解释一下你为什么这样做吗?自动添加的想法是让您始终拥有数据库表的唯一键。通常,这些键不需要更改(无论数字如何,它都不会减慢您的数据库速度 - 即使数字是 1、2、3 和 7463,仍然只有 4 个条目)。
  • 这确实经常被问到,答案总是一样的——尝试填补空白是非常不可取的。许多动态重新编号的解决方案都容易出现竞争条件。

标签: php mysql auto-increment


【解决方案1】:

您不应该这样做,因为 auto_increment 采用这种方式设计是有充分理由的(例如,如果您有一个备份并且当它包含已重写的旧删除 id 时想要恢复它,该怎么做你有吗?)

但要回答您的问题: 你必须使用

ALTER TABLE `table` AUTO_INCREMENT = MAX(id)+1;

删除后可以触发

【讨论】:

  • 这会破坏他的数据一致性。 (见我的帖子)
  • 然后我将其编辑为使用 id+1 而不是 id。如果他不删除最后一个 id,他仍然会在他的桌子上留下漏洞,但无论他不应该改变 auto_increment 的行为,我们都同意这一点
  • 不应该是MAX(id)+1 而不是MAX(id+1) 吗?
  • 你完全正确,我编辑了
【解决方案2】:

如果您真的想这样做(我个人鼓励您使用自动增量),您需要执行事务以获取最后一个 ID 并插入新行,设置其 ID 根据另一个递增.

【讨论】:

    【解决方案3】:

    这样做不是一个好主意,ID 应该始终保持唯一,无论记录是存在还是被删除。

    但是如果你真的想这样做,你可以用类似的东西来实现它

    select max(id) + 1 of bla;
    

    但您需要正确的事务级别,因为如果您不这样做,您就有可能出现重复的 ID。

    【讨论】:

      【解决方案4】:

      您可以选择最大 id 值并增加它。

      SELECT MAX(`id`)+1 as `new id` FROM `table`;
      

      如果您有 5 个条目并且第 3 个被删除,这仍然会让您获得 6 作为下一个 ID。

      【讨论】:

      • 但是如果同时运行 2 个查询,它们都会得到 6 作为下一个 id。但 auto_increment 也会正确提供 6 和 7。
      • 我认为这很明显。您将不得不锁定桌子。
      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2021-03-21
      • 2014-05-06
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多