Переиндексация столбца позиции в mysql

Это вопрос 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            |
|-----------------|--------------------|--------------|

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


person calumbrodie    schedule 04.03.2011    source источник
comment
Почему вы хотите этого? Есть сценарии, в которых это может быть желательно (например, чтобы ваш жесткий диск читал последовательные сектора на диске для последовательных строк), но это очень микро-оптимизация. Хороший индекс сделает за вас 99% работы, порядок в таблице на самом деле не так важен.   -  person Konerak    schedule 04.03.2011
comment
Порядок имеет значение - он сам по себе имеет смысл внутри системы. Я отредактировал свой вопрос, чтобы удалить индекс (который не имеет отношения к вопросу). Спасибо   -  person calumbrodie    schedule 04.03.2011


Ответы (1)


создайте таблицу с аналогичной схемой, но сделайте положение столбца как 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

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

person ajreal    schedule 04.03.2011
comment
Спасибо за ваш ответ - это сработало бы для примера, который я привел, - но я искал утверждение, которое я мог бы запустить. Существует дополнительная сложность, которая означает, что это не сработает в моем случае. Извините, что не включил это в исходный вопрос - сейчас я отредактирую его, чтобы лучше объяснить - person calumbrodie; 04.03.2011