Защо PHPMyAdmin не променя ефективно моите таблици?

Направих локална таблица с моя 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 индекс). 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 ли е? Ако е така, това не е добра причина за премахване на поле за първичен ключ, тъй като е тривиално да се ПОРЪЧА ПО полето, когато се прави заявка към базата данни. - person Mike Brant; 14.05.2013
comment
Не е само за удобство на дисплея. Трябва да направя изчисление на Rho на Spearman между две променливи, едната от които е фамилното име на респондентите (което съдържа добавено число, ако повече имат едно и също фамилно име, както в Johnson 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