MySQL - 在不中断AUTO_INCREMENT的情况下插入行

时间:2013-09-23 18:38:14

标签: mysql primary-key auto-increment

快速提问:

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

效果很好。唯一的问题是,有时候游戏会被重新安排并转移到以后的日期,或者添加新游戏并且必须插入已经存在的时间表中。到目前为止,我不得不手动编辑每个受影响的行的ID(使用PhpMyAdmin)来考虑更改,这可能非常繁琐且耗时。

我真正想要做的是将表设置为即时重新调整主键值。这意味着,如果我将一个全新的游戏插入到表格的第五行,之后的所有游戏都将自动重新调整(ID 5将变为6,ID 6将变为7,依此类推)。

有没有办法设置表来执行此操作,还是我可以用来完成它的特定SQL命令?如果已经以不同的方式多次询问过此道歉。感谢任何反馈。

2 个答案:

答案 0 :(得分:2)

您不应该使用PRIMARY KEY。添加一个特殊列,例如sort,其中包含常规INDEX,而不是UNIQUE。它也不必是INT,您可以使用real numbers。这样,您始终可以在计划的任意两行之间插入新行。

答案 1 :(得分:1)

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

尝试调整值不仅仅是手动和笨拙,但它有race conditions的风险,否则需要锁定很多行。如果您插入一个ID为5的行,但是您的表的行数大于id 5?

,该怎么办?

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

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