在MySQL中自动递增的列

时间:2018-07-02 18:03:48

标签: mysql sql database

我需要创建一个自动从1开始递增的列(但是有多少行)。但是,我需要根据我的概率列的顺序对该列进行重新排序。有可能吗?

2 个答案:

答案 0 :(得分:0)

我通常建议不要将这种排序计算实现为显式表字段。随着表的增长,使此类信息保持最新状态将产生越来越大的开销。相反,您可以只按ORDER BY您的概率列;或者,如果您确实需要查询结果中的“排名”,则可以通过多种方法来执行此操作,例如:

SELECT @seq := seq + 1, d.*
FROM theRealData AS d, (SELECT @seq := 0) AS init
ORDER BY theRealData.probability
;

我在下面的注释中提到的存储过程的伪代码(我在写这篇文章时没有在寻找确切的语法,所以可能有些事情我忽略了)(如果我的顺序颠倒了,可能需要调整。) )

CREATE PROCEDURE theProc (newID INT)
BEGIN
   DECLARE newProb INT; //Not sure if it is int, but for the sake of example
   DECLARE seqAt INT;
   SET newProb = SELECT probability FROM theTable WHERE ID = newID;
   SET seqAt = SELECT IFNULL(min(seq), 1) FROM theTable WHERE probability > newProb;
   UPDATE theTable SET seq = seq + 1 WHERE seq >= seqAt;
   UPDATE theTable SET seq = seqAt WHERE ID = newID;
END

如果传递所有插入的字段,而不只是插入新行后的ID,则该过程可以自行插入并使用last_insert_id()完成其余工作。

答案 1 :(得分:0)

修改主键值可能会变得非常昂贵,特别是如果您有指向它的相关表时。

如果您需要按概率保持顺序,建议您在Video后面增加一列。您可以在每次插入后或每分钟,每小时或每天更新一次此列。

或者,就像@Uueerdo所说的那样,您可以在查询表行时使用probability_order