Мне нужно создать столбец, который автоматически увеличивается с 1- (однако количество строк есть). Тем не менее, мне нужен столбец для изменения порядка в зависимости от столбца "Порядок моей вероятности". Возможно ли это?
Обычно я рекомендую не применять такой порядок расчета как явное поле таблицы. Сохранение такой информации в актуальном состоянии будет создавать все больше и больше накладных расходов, поскольку таблица растет. Вместо этого вы можете просто ЗАКАЗАТЬ по столбцу вероятности; или если вам действительно нужен "ранг" в результатах запроса, есть несколько способов сделать это, что-то вроде этого должно работать:
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() для выполнения остальной части работы.
Изменение значений первичного ключа может стать очень дорогостоящим, особенно если у вас есть связанные таблицы, которые указывают на него.
Если вам нужно сохранить порядок по вероятности, я бы предложил добавить дополнительный столбец с probability_order
. Вы можете обновить этот столбец после каждой вставки или каждую минуту, час или день.
В качестве альтернативы, поскольку @Uueerdo говорит, что вы можете просто использовать ORDER BY
при запросе строк таблицы.
AFTER INSERT
мог бы добиться цели ...