Я бы вообще рекомендовал не реализовывать такого рода вычисления порядка как явное поле таблицы. Поддержание такой информации в актуальном состоянии приведет к увеличению расходов по мере роста таблицы. Вместо этого вы можете просто ЗАКАЗАТЬ ваш столбец вероятности; или если вам действительно нужен «ранг» в результате запроса, есть несколько способов сделать это, что-то вроде этого должно работать:
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
Если вы передадите все вставленные поля вместо идентификатора новой строки после того, как он будет вставлен, то процедура может выполнить вставку самостоятельно и использовать last_insert_id () для выполнения остальной части работы.