Переиндексация столбца позиции в MySQL - PullRequest
0 голосов
/ 04 марта 2011

Это вопрос MySQL:

У меня есть таблица со следующей структурой.

reference
position
parent

Каждый предмет должен иметь позицию, и каждая позиция должна использоваться только один раз. Позиции должны увеличиваться (поэтому, если есть 40 пунктов, то позиции должны быть от 1 до 40).

Однако данные в этой таблице повсюду (одна и та же позиция используется более одного раза, некоторые строки без позиции). Я хотел бы сбросить таблицу путем повторной индексации позиций. Я хотел бы уважать существующие ордера (даже если они не идеальны) при этом (если это вообще возможно - если нет, позиции могут быть отброшены).

------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|ASHDFNS          |2                   |89            |
|BSHDFNS          |2                   |89            |
|CSHDFNS          |1                   |89            |
|DSHDFNS          |100                 |89            |
|ESHDFNS          |8                   |89            |
|FSHDFNS          |22                  |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |22                  |11            |
|CSHDFNS          |333                 |11            |
|-----------------|--------------------|--------------|

Желаемая

-------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|CSHDFNS          |1                   |89            |
|ASHDFNS          |2                   |89            |
|BSHDFNS          |3                   |89            |
|ESHDFNS          |4                   |89            |
|FSHDFNS          |5                   |89            |
|DSHDFNS          |6                   |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |2                   |11            |
|CSHDFNS          |3                   |11            |
|-----------------|--------------------|--------------|

РЕДАКТИРОВАТЬ: Извините, простое автоматическое увеличение столбца позиции не будет работать, так как таблица описывает позиции элементов в нескольких родителях (и элементы могут иметь более одного родителя)

1 Ответ

1 голос
/ 04 марта 2011

создать таблицу с похожей схемой, но сделать позицию столбца как auto_increment

после этой вставки из порядка old_table в любом порядке по вашему желанию

insert into new_table select reference, 0, parent from old_table 
order by if (position is null, 99999, position);

после этого переименуйте old_table, переименуйте new_table в old_table

В противном случае, определить пользовательские переменные для представления позиции

вот так - обновите и выберите ту же проблему с таблицей в mysql

или это - Обновление столбца, чтобы он содержал позицию строки

...