【问题标题】:MySQL - Insert Row Without Disrupting AUTO_INCREMENTMySQL - 在不中断 AUTO_INCREMENT 的情况下插入行
【发布时间】:2013-09-23 18:38:14
【问题描述】:

快速提问:

我有一个体育联盟数据库,其中包含游戏列表(比如说 40 个左右)。从电子表格导入整个赛程时,每场比赛都会自动分配一个 ID 号作为主键。由于这个不可见的(对用户)主键,游戏然后按降序显示在网页上。这是一个例子:League Schedule

效果很好。唯一的问题是,有时比赛会被重新安排并移至以后的日期,或者添加新游戏并且必须将其插入到已经存在的时间表中。至此,我不得不手动编辑每个受影响行的 ID(使用 PhpMyAdmin)来解释更改,这可能非常乏味且耗时。

我真正想做的是设置表格以即时重新调整主键值。也就是说,如果我在表格的第五行插入一个全新的游戏,那么之后的所有游戏都会自动重新调整(ID 5 将变为 6,ID 6 将变为 7,依此类推)。

有没有办法设置表来执行此操作,或者我可以使用特定的 SQL 命令来完成它?如果已经以不同的方式多次询问过这个问题,我们深表歉意。感谢您提供任何和所有反馈。

【问题讨论】:

    标签: mysql primary-key auto-increment


    【解决方案1】:

    您不应该为此使用 PRIMARY KEY。添加一个特殊的列,如sort,使用常规的INDEX,而不是UNIQUE。它也不必是INT,您可以使用real numbers。这样,您将始终能够在日程表的任意两行之间插入新行。

    【讨论】:

      【解决方案2】:

      不,自动增量要求是唯一的,但它不需要按任何特定顺序甚至是连续的。自动增量单调递增的事实只是其实现的巧合。不要依赖按时间顺序排列的值。

      尝试调整这些值不仅手动且笨拙,而且有race conditions 的风险,否则需要锁定很多行。如果插入 id 为 5 的行,但表中有 10 亿行大于 id 5,该怎么办?

      还存在重新编号主键列的风险,因为任何收到电子邮件告诉他们需要进入第 42 场游戏的用户最终可能会进入错误的游戏。

      如果您需要按特定顺序(例如按时间顺序)查看行,请为此使用 DATE 列,而不是自动递增列。

      【讨论】:

      • "如果你插入一个 id 为 5 的行,但你的表比 id 5 多 10 亿行怎么办?"没错..真是让人头疼!非常感谢您提供有用的反馈。
      猜你喜欢
      • 2016-09-22
      • 2010-12-04
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多