快速提问:
我有一个体育联盟数据库,里面有一系列游戏(比如40左右)。从电子表格导入整个计划时,每个游戏都会自动分配一个ID号作为主键。然后,由于这个不可见(对用户)主键,游戏以降序显示在网页上。这是一个例子:League Schedule
效果很好。唯一的问题是,有时候游戏会被重新安排并转移到以后的日期,或者添加新游戏并且必须插入已经存在的时间表中。到目前为止,我不得不手动编辑每个受影响的行的ID(使用PhpMyAdmin)来考虑更改,这可能非常繁琐且耗时。
我真正想要做的是将表设置为即时重新调整主键值。这意味着,如果我将一个全新的游戏插入到表格的第五行,之后的所有游戏都将自动重新调整(ID 5将变为6,ID 6将变为7,依此类推)。
有没有办法设置表来执行此操作,还是我可以用来完成它的特定SQL命令?如果已经以不同的方式多次询问过此道歉。感谢任何反馈。
答案 0 :(得分:2)
您不应该使用PRIMARY KEY。添加一个特殊列,例如sort
,其中包含常规INDEX
,而不是UNIQUE
。它也不必是INT
,您可以使用real numbers。这样,您始终可以在计划的任意两行之间插入新行。
答案 1 :(得分:1)
不,自动增量必须是唯一的,但不要求任何特定顺序甚至连续。自动增量单调增加的事实只是其实现的巧合。不要依赖于按时间顺序排列的值。
尝试调整值不仅仅是手动和笨拙,但它有race conditions的风险,否则需要锁定很多行。如果您插入一个ID为5的行,但是您的表的行数大于id 5?
,该怎么办?还存在重新编号主键列的风险,因为任何收到电子邮件告知他们需要进入游戏42的用户可能最终会进入错误的游戏。
如果您需要按特定顺序查看行(例如按时间顺序排列),则使用DATE列,而不是自动增量列。