Каков самый элегантный способ создать целочисленную последовательность в mysql? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть таблица с различными столбцами, один из которых priority, то есть INT. Поле priority всегда представляет собой последовательность из 1...n, указывающую приоритет / порядок данных. Считайте, что это всегда правильно.

Теперь в моем приложении есть функция, которая удаляет строку в этой таблице. Следовательно, мне нужно было бы найти элегантный способ переделать столбец приоритета после удаления записи. Какой самый элегантный способ сделать это прямо в Mysql? Я хочу попробовать и не делать это программно через свое приложение (PHP). Пример перед удалением:

ID   priority    bar
1    1           66
43   2           66
54   3           66
4    4           66

Таблица после удаления

ID   priority    bar
1    1           66
54   3           66
4    4           66

должна быть обновлена ​​до

ID   priority    bar
1    1           66
54   2           66
4    3           66

Большое спасибо за ваши идеи!

Изменить: По многочисленным просьбам:

CREATE TABLE `foo`
(`id` INT NOT NULL, `priority` INT NOT NULL , `bar` INT NOT NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;

INSERT INTO foo VALUES (1, 1, 66), (43, 2, 66), (54, 3, 66), (4, 4, 66);

1 Ответ

0 голосов
/ 19 июня 2020

Вы можете сделать то, что предлагает @ HoneyBoyWilson , и написать триггер, который будет уменьшать приоритет при удалении ...

update foo
  set priority = priority - 1
  where priority > :whatever priority got deleted:

И увеличивать при вставке ...

update foo
  set priority = priority + 1
  where priority < :whatever priority got deleted:

И еще один триггер для обновления.


Но, вероятно, проще оставить priority как есть и использовать rank() для заполнения пробелов.

select *, rank() over w
from foo
window w as (order by priority asc)

id  priority    bar  rank() over w
1   1           66   1
54  3           66   2
4   4           66   3

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

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