Столбец, который автоматически увеличивается в MYSQL - PullRequest
0 голосов
/ 02 июля 2018

Мне нужно создать столбец, который автоматически увеличивается от 1 до (как бы там ни было строк). Однако мне нужно изменить порядок столбцов в зависимости от порядка моего столбца вероятности. Это возможно?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Изменение значений первичного ключа может быть очень дорогим, особенно если у вас есть связанные таблицы, которые указывают на него.

Если вам нужно сохранить порядок по вероятности, я бы предложил добавить дополнительный столбец с probability_order. Вы можете обновлять этот столбец после каждой вставки или каждой минуты, часа или дня.

В качестве альтернативы, как говорит @Uueerdo, вы можете просто использовать ORDER BY при запросе строк таблицы.

0 голосов
/ 02 июля 2018

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

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 () для выполнения остальной части работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...