Почему PHPMyAdmin не может эффективно изменить мои таблицы?

Я создал таблицу local с помощью моего PHPMyAdmin (XAMPP). Я могу делать с ним все что угодно, но я не могу сделать постоянное изменение порядка.

Например, на вкладке «Операции» есть функция «Изменить порядок таблиц». Но этого не будет. Я могу выбрать поле, выбрать «По возрастанию» или «По убыванию», нажать «Перейти», и система даже сообщит, что запрос выполнен успешно. Но когда я впоследствии просматриваю таблицу, ничего не меняется. Независимо от того, какое поле я выбираю.

Альтернативный метод тоже не работает. Система позволит мне толкать стол сколько угодно, пока это происходит через команду

SELECT * FROM table_name ORDER BY field_name .

Но когда я вхожу

ALTER TABLE table_name ORDER BY field_name

таблица не меняется ни на йоту, а я получаю сообщение об успешном выполнении запроса.

Как это возможно?


person Frank Conijn    schedule 14.05.2013    source источник


Ответы (1)


Если у вас есть таблица InnoDB с первичным ключом или ненулевым уникальным ключом индекса, это не будет иметь никакого эффекта, так как InnoDB ВСЕГДА будет упорядочивать эти ключи.

Вот текст непосредственно со страницы ALTER TABLE руководства MySQL (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html):

ORDER BY не имеет смысла для таблиц InnoDB, содержащих определяемый пользователем кластерный индекс (PRIMARY KEY или NOT NULL UNIQUE index). InnoDB всегда упорядочивает строки таблицы в соответствии с таким индексом, если он присутствует.

person Mike Brant    schedule 14.05.2013
comment
Хорошо, спасибо, особенно за быстрый ответ. Я должен сказать, что мне кажется смешным, что PHPMyAdmin говорит, что запрос был выполнен успешно, в то время как на практике он вообще не выполнялся, но я нашел средство с помощью информации, которую вы мне дали: удалить поле первичного ключа. И для тех, кто прочтет это: InnoDB является механизмом хранения по умолчанию для MySQL, начиная с MySQL 5.5. См. en.wikipedia.org/wiki/InnoDB. Здоровья, Майк! - person Frank Conijn; 14.05.2013
comment
@FrankConijn Запрос был выполнен, он просто не имеет никакого эффекта. Это не проблема с PHPMyAdmin, так как он просто сообщает то, что говорит ему MySQL (что запрос был выполнен). Вы можете запустить команду непосредственно в MySQL, и вы увидите тот же результат. Думаю, я не понимаю, почему вы так зациклены на порядке какого-то столбца с непервичным ключом, неуникальным ключом. Это просто для удобства отображения в PHPMyAdmin? Если это так, то это не веская причина для удаления поля первичного ключа, поскольку ORDER BY для поля при запросе к базе данных тривиально. - person Mike Brant; 14.05.2013
comment
Это не только для удобства отображения. Мне нужно выполнить вычисление ро Спирмена между двумя переменными, одна из которых является фамилией респондентов (которая содержит добавленное число, если больше имеют ту же фамилию, как в Джонсоне 02). Для этого я должен расположить фамилии в алфавитном порядке и присвоить им ранг. Этот первый шаг никогда не работал (и стоил мне нескольких часов...), пока вы не объяснили, почему. Самый простой способ присвоить фамилиям их надлежащий ранг — это удалить первичный ключ, упорядочить таблицу по фамилии и повторно вставить первичный ключ. - person Frank Conijn; 15.05.2013
comment
@FrankConijn Это альтернативные способы создания нумерованной последовательности в MySQL. Например, ознакомьтесь с методом, предложенным во втором ответе здесь: stackoverflow.com/questions/304461/ - person Mike Brant; 15.05.2013
comment
Я уже нашел этот метод в другом потоке SO: SET @rownum=0; UPDATE table_name SET rank_field=(@rownum:=@rownum+1); (порядок должен быть выполнен, а rank_field должен быть создан первым), но я немного смущен: метод, который вы связали с заказом, создает rank_field и дает номер ранга Все одновременно? Если нет, то что именно он делает и чего не делает? - person Frank Conijn; 16.05.2013
comment
@FrankConijn Это всего лишь пример использования этого вопроса SO. В вашем случае вам, очевидно, потребуется добавить предложение ORDER BY, чтобы указать порядок, в котором должны выполняться обновления. S что-то вроде UPDATE table_name SET rank_field=(@rownum:=@rownum+1) ORDER BY field_name. Это обновит эти строки в порядке, указанном в поле ORDER BY, увеличивая значение @rownum с каждой обновленной строкой. - person Mike Brant; 16.05.2013
comment
Эта строка кода снова имеет смысл. Еще раз спасибо, Майк! Я действительно ценю твою помощь. - person Frank Conijn; 17.05.2013